python在将列表传递给方法时使用延迟赋值

chr*_*svp 2 python generator

我有一个python类A和它的子B.我创建一个B类对象传递一些列表类型参数,这些参数附加在B中,结果存储在类A中.我希望能够更改其中一个初始值参数,看到变化反映没有进一步的ado.让我用一个例子来解释一下:

class A():
    def __init__(self,data):
        self.a=data

class B(A):
    def __init__(self,x,y):
        self.x=x
        self.y=y
        A.__init__(self,self.x+self.y)

    def change_x(self,x):
        self.x = x
Run Code Online (Sandbox Code Playgroud)

现在,我跑了

test = B([1, 2], [3,4])
print(test.a)
Run Code Online (Sandbox Code Playgroud)

我显然得到[1,2,3,4].如果我更改部分列表如下:

test.change_x([3,4])
print(test.a)
Run Code Online (Sandbox Code Playgroud)

我想得到[3,4,3,4],而不是我收到[1,2,3,4].当然test.a仅在实例化期间进行评估.

我理解为什么不是这种情况,我读到了关于生成器但没有设法弄清楚如何实现它.我不想最终得到一个我只能迭代一次的迭代.

谁能帮助我?一个干净的方法解决这个问题?

Kar*_*rin 7

是否有理由参加课程A?您可以创建一个a在类中返回所需内容的属性或方法B.

class B():
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def change_x(self, x):
        self.x = x

    @property
    def a(self):
        return self.x + self.y


test = B([1, 2], [3, 4])
print(test.a)  # [1, 2, 3, 4]

test.change_x([3, 4])
print(test.a)  # [3, 4, 3, 4]
Run Code Online (Sandbox Code Playgroud)

小注意:通过此实现,该change_x方法不是必需的.直接访问属性(例如test.x = x)比使用getter和setter 更通常更像Pythonic .