部分继承继承继承一些功能,减去一个有问题的方法

2024-06-07 11:19:10 发布

您现在位置:Python中文网/ 问答频道 /正文

从实现了不推荐使用的__getslice__的父级继承时,是否有任何方法可以在原始片被munging之前获取它?在

下面是一个示例测试用例,我不知道如何在相关信息丢失之前重写__getslice__。可以用蒙克斯补丁代替吗?可以通过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作为ssce,我并不是真的要创建一个BigList类,而是想知道当父类可能已经实现了__getslice__时,如何绕过限制。在

以下尝试无效:

^{pr2}$

del语句引发AttributeError,即使hasattr(MyList, '__getslice__')返回True。在

这个问题接this one。在


Tags: fromimportselfsysslicemockstarttestcase
1条回答
网友
1楼 · 发布于 2024-06-07 11:19:10

在C中定义的类型上不能使用monkeypatch,这是因为list没有{}。而是填充^{} structure中的sq_slice槽。允许重写,但不能使其消失。在

即使您继承了Python实现,monkey-patching也可以归结为从原始类中删除__getslice__方法。在

您唯一的选择是提供自己的版本,这包括sys.maxsize限制。我更喜欢使用^{} object作为这样的覆盖:

def __getslice__(self, start, stop):
    return self[slice(start, stop)]

前提是基类型知道如何处理slice对象(如果要支持跨步,就必须这样做)。在

通过使用三元素切片表示法或传递显式slice()对象,可以完全避免__getslice__方法:

^{pr2}$

相关问题 更多 >

    热门问题