我有一个 python 类 A 及其子类 B。我创建了一个类 B 的对象,传递了一些列表类型的参数,这些参数附加在 B 中,结果存储在类 A 中。我希望能够更改一个那些最初的论点,并立即看到变化反射(reflect)出来。让我用一个例子来解释:
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
现在,我跑
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],而不是当然,我收到 [1,2,3,4]。当然,test.a 仅在实例化期间进行评估。
我理解为什么情况并非如此,并且我阅读了有关生成器的内容,但没有弄清楚如何实现它。我不想以只能迭代一次的迭代结束。
谁能帮帮我?解决这个问题的干净方法?
最佳答案
是否有理由拥有 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]
小提示:对于这个实现,change_x
方法应该不是必需的。直接访问属性(例如 test.x = x
)通常比使用 getter 和 setter 更符合 Pythonic。
关于python 在将列表传递给方法时使用惰性赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39068974/