Python 部分继承-继承一些功能,减去有问题的方法
当从实现了不推荐的Python 部分继承-继承一些功能,减去有问题的方法,python,python-2.7,inheritance,monkeypatching,Python,Python 2.7,Inheritance,Monkeypatching,当从实现了不推荐的\uuu getslice\uuu的父级继承时,是否有任何方法可以在原始切片被剪切之前获取它 这是一个示例测试用例,我不知道如何在相关信息丢失之前覆盖\uuuu getslice\uuuu。可以用monkeypatching来代替吗?可以通过cpython扩展完成吗 from unittest import TestCase from mock import patch import sys class BigIntSlicableList(list): def _
\uuu getslice\uuu
的父级继承时,是否有任何方法可以在原始切片被剪切之前获取它
这是一个示例测试用例,我不知道如何在相关信息丢失之前覆盖\uuuu getslice\uuuu
。可以用monkeypatching来代替吗?可以通过cpython扩展完成吗
from unittest import TestCase
from mock import patch
import sys
class BigIntSlicableList(list):
def __getslice__(self, start, stop):
return self[start:stop:None] # force fallback to __getitem__
class BigIntSlicableListTest(TestCase):
@patch.object(BigIntSlicableList, '__getitem__')
def test_slice_big_endpoint(self, mock):
mylist = BigIntSlicableList([1, 2, 3])
start, stop = sys.maxint - 1, sys.maxint + 1
bigint_slice = slice(start, stop)
mylist[start:stop]
mock.assert_called_once_with(bigint_slice)
self.assertEqual(mylist[start:stop], mylist[start:stop:])
注意:我只是在这里使用list
作为示例,我并不是真的想创建一个BigList类,而是想知道当父类可能已经实现了\uuu getslice\uuu
时,如何绕过这个限制
以下尝试无效:
class MyList(list):
pass
del MyList.__getslice__
del语句会引发AttributeError
,即使hasattr(MyList,'.\u getslice'.
返回True
这个问题是从一开始的 你不能,不能在C中定义的类型上使用monkeypatch。这是因为
列表
没有\uu getslice\uuu
。相反,它将填充中的sq_切片
插槽。允许重写,但不能使其消失
即使您继承了Python实现,monkey补丁也可以归结为从原始类中删除\uuu getslice\uuu
方法
您唯一的选择是提供自己的版本,其中包括sys.maxsize
限制。我更喜欢使用a来进行这种覆盖:
def __getslice__(self, start, stop):
return self[slice(start, stop)]
假设基类型知道如何处理切片
对象(如果它想支持跨步,就必须这样做)
通过使用三元素切片表示法或通过传入显式的slice()
对象,可以完全避免使用\uuuu getslice\uuuu
方法:
mylist[start:stop:None]
mylist[slice(start, stop)]
您能否以某种方式从MRO中删除
\uuu getslice\uuu
?您的示例中的覆盖行为是否与我在问题中显示的覆盖行为相同?为什么更可取?@wim:不,你不能。没有办法假装方法不存在。@wim:我更喜欢创建slice()
对象,而不是让Python来做;在引擎盖下,self[start:stop:None]
创建了那个对象。@wim:我也发布了你上一个问题的答案;在任何情况下,都不能通过“删除”\uuuu getslice\uuuu
来解决此问题。