问题描述
我正在尝试对list
进行子类化,以便创建就地方法,以其 self 的逐项总和和一个新列表来更新self
。示例:
这是我尝试的方法:
class RecordBook(list):
def accumulate(self,new_values):
self = RecordBook([x+y for x,y in zip(self,new_values)])
尽管如此,重新绑定到self
会对其进行修改。但是,它不起作用。
>> d = RecordBook([1,2,3,4,5,6])
>> d
[1,6]
>> d.accumulate([1]*6)
>> d
[1,6] # should have been [2,6,7]
为什么任务失败了,怎么办呢?
解决方法
这是将collections.UserList
子类化,并修改子类的基础self.data
的一种方法。
如@Deceze在评论中所述:
self只是一个局部变量,向其分配其他内容不会替换现有对象
UserList
公开了self.data
属性,可以“就地”对其进行修改
from collections import UserList
class Accumulator(UserList):
def accumulate(self,seq):
for idx,elt in enumerate(seq):
self.data[idx] += elt
if __name__ == '__main__':
d = Accumulator([1,2,3,4,5,6])
d.accumulate([1]*6)
print(d)
输出:
[2,6,7]