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
来解决此问题。