我想扩展类“list”的功能并为事件添加自定义处理程序:“将新项目添加到列表”和“从列表中删除项目”。对于这个任务,我不想使用组合,更好的是继承。
我尝试过做什么:
class ExtendedList(list):
def append(self, obj):
super(ExtendedList, self).append(obj)
print('Added new item')
def extend(self, collection):
if (hasattr(collection, '__iter__') or hasattr(collection, '__getitem__')) and len(collection)>0:
for item in collection:
self.append(item)
def insert(self, index, obj):
super(ExtendedList, self).insert(index, obj)
print('Added new item')
def remove(self, value):
super(ExtendedList, self).remove(value)
print('Item removed')
但它无法正常工作。我无法捕捉所有添加和删除事件。例如:
collection = ExtendedList()
collection.append('First item')
# Out: "Added new item\n"; collection now is: ['First item']
collection.extend(['Second item', 'Third item'])
# Out: "Added new item\nAdded new item\n"; collection now is: ['First item', 'Second item', 'Third item']
collection += ['Four item']
# Don't out anythink; collection now is: ['First item', 'Second item', 'Third item', 'Four item']
collection.remove('First item')
# Out: "Item removed\n"; collection now is: ['Second item', 'Third item', 'Four item']
del collection[0:2]
# Don't out anythink; collection now is: ['Four item']
collection *= 3
# Don't out anythink; collection now is: ['Four item', 'Four item', 'Four item']
根据我的情况扩展课程“列表”的正确方法是什么?谢谢你的帮助。
答案 0 :(得分:5)
不是继承自list
本身,而是继承自其抽象基类collections.MutableSequence
。这将为您完成所有基本工作,让您专注于您想要改变的内容。关于ABC here有一个很好的问题。
答案 1 :(得分:3)
*=
,+=
和del
等操作是使用list
类的运算符函数实现的,例如__add__
,__delitem__
,{ {1}}等等。有很多。如果您想拦截对“扩展”列表类的所有可能调用,则需要覆盖大多数(如果不是全部)运算符。
由于您无法控制内置类的实现方式,因此通常更容易撰写围绕内置的新类而不是内置的继承。
答案 2 :(得分:2)
如果要覆盖+等运算符,则需要明确地执行此操作。 The documentation将帮助您找出需要改变的内容。
答案 3 :(得分:1)
查看UserList类:http://pydoc.org/2.2.3/UserList.html
它显示了您需要更改的所有方法。
问题是type(ExtendedList([]) * 2) == list
。