我想有类似的方法,一些Python类的list
(假设这就是所谓的mylist
)除了mylist
接受特定类型的元素(另一个customed类的实例存储在我的情况下,一些数据)。
我读了SO一些帖子,知道我需要重写一些方法如append
, extend
, insert
。 但我不知道我需要的一切覆盖,以保证在所有的操作(如添加,添加,延长,插入,切片...),以实例mylist
就不会有问题。
如果有没有需要重写很多方法中的一种更便捷的方式?
我想有类似的方法,一些Python类的list
(假设这就是所谓的mylist
)除了mylist
接受特定类型的元素(另一个customed类的实例存储在我的情况下,一些数据)。
我读了SO一些帖子,知道我需要重写一些方法如append
, extend
, insert
。 但我不知道我需要的一切覆盖,以保证在所有的操作(如添加,添加,延长,插入,切片...),以实例mylist
就不会有问题。
如果有没有需要重写很多方法中的一种更便捷的方式?
有时候,事情没有从内置对象继承更容易...:
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)