子类中的就地方法 输出:

问题描述

我正在尝试对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]