我想用新的属性扩展UserList类(https://docs.python.org/3/library/collections.html#collections.UserList),如下所示:
class GroceryList(UserList):
def __init__(self, initlist, max_item_weight, max_item_volume):
super().__init__(initlist)
self.max_item_weight = max_item_weight
self.max_item_volume = max_item_volume
字符串
现在,如果我切片GroceryList,我会丢失max_item_weight
和max_item_volume
属性,所以我会覆盖__getitem__
方法:
def __getitem__(self, i):
if isinstance(i, slice):
return self.__class__(self.data[i], self.max_item_weight, self.max_item_volume)
else:
return self.data[i]
型
我如何覆盖UserList
__getitem__
方法,使它更通用,并且我不必为我创建的每个新类型的列表覆盖__getitem__
方法,例如:GroceryList
、ToolsList
、NonEdibleList
...因为我想在分割了派生列表之后保留属性。
3条答案
按热度按时间kx1ctssn1#
您可以复制该对象并仅更改
self.data
变量。类似于以下内容:字符串
然后,您可以按照与继承
UserList
相同的方式继承这个类。例如,型
给出
[4, 5, 6, 7] 7 6
作为输出,其中list是切片数据,7,6是原始属性。另一种方法如下,但这需要一些额外的bookeeping和在继承时使用关键字参数。
型
相同的示例随后更改为:
型
其给出相同的输出。
dxpyg8gm2#
我有一个很好的解决方案,它虽然能确保所有的方法都能正常工作,但是在一些内置函数上会出现错误,比如
isinstance
字符串
aiqt4smr3#
没有什么好的理由继承
collections.UserList
而不是list
。特别是在这种情况下,拥有data
属性会使将自己的附加属性传递给构造函数变得麻烦,因为在将data
键解包到构造函数之前,你必须从属性字典中删除它。通过继承
list
,您可以以一种干净和通用的方式直接将vars(self)
解压缩到构造函数:字符串
该输出:
型
演示:https://replit.com/@blhsing/TemptingSourBash