如何使Python中的迭代器类,其中只有一个特定类型的允许是元素?(How to make an i

2019-11-04 02:07发布

我想有类似的方法,一些Python类的list (假设这就是所谓的mylist )除了mylist接受特定类型的元素(另一个customed类的实例存储在我的情况下,一些数据)。

我读了SO一些帖子,知道我需要重写一些方法如appendextendinsert 。 但我不知道我需要的一切覆盖,以保证在所有的操作(如添加,添加,延长,插入,切片...),以实例mylist就不会有问题。

如果有没有需要重写很多方法中的一种更便捷的方式?

Answer 1:

有时候,事情没有从内置对象继承更容易...:

from collections import MutableSequence, Iterable

class MyList(MutableSequence):
    def __init__(self, type, iterable=()):
        self._data = []
        self._type = type
        self.extend(iterable)

    def insert(self, index, item):
        if not isinstance(item, self._type):
            raise TypeError
        self._data.insert(index, item)

    def __len__(self):
        return len(self._data)

    def __getitem__(self, *args):
        return self._data.__getitem__(*args)

    def __delitem__(self, *args):
        self._data.__delitem__(*args)

    def __setitem__(self, key, value):
         if isinstance(value, collections.Iterable) and isinstance(key, slice):
             values = []
             for val in value:
                 if not isinstance(value, self._type):
                     raise TypeError
         else:
             if not isinstance(value, self._type):
                 raise TypeError
         self._data[k] = value

请注意,我没有去成左右,这是否是一个好主意任何讨论。 有些人会告诉你不要做,因为蟒蛇是建立在“鸭打字”。 也有人说, isinstance是完全没有用-前提是你要有责任感。 此视图(亚历马尔泰利)中的一个提议者通常被认为是一个python专家。 他建议isinstance对抽象基类检查,并呼吁这一做法“鹅打字”。 这种做法似乎已经获得了一些牵引力标准库缓慢增加的支持,将允许这些事情更强大的运行时检查-考虑PEP-0484 (类型提示)。

我想,我的观点是,如果你使用这个类,不这样做:

lst1 = MyList(list)
lst2 = MyList(int)

这样做:

lst1 = MyList(collections.MutableSequence)
lst2 = MyList(numbers.Integral)


文章来源: How to make an iterable class in Python in which only a specific type is allowed to be the element?