下面的代码有两个类,我正在尝试从
Child1
类更新父类变量。
class Parent:
def __init__(self):
self.shared_variable = "I am a shared variable"
class Child1(Parent):
def __init__(self):
super().__init__()
def change_variable(self, new_value):
self.shared_variable = new_value
class Child2(Parent):
def __init__(self):
super().__init__()
# Example usage:
child1_instance = Child1()
child2_instance = Child2()
print(child1_instance.shared_variable) # Initial value
child1_instance.change_variable("New value from Child1")
print(child2_instance.shared_variable) # Updated value accessed by Child2
但是,使用
shared_variable
更新 child1_instance
的值后,child2_instance
显示的输出仍然相同。我该如何纠正这个问题?
期望的输出是:
I am a shared variable
New value from Child1
尽管有它的名字,但您在
shared_variable
中创建的 Parent.__init__
实际上并未在任何事物之间共享。它针对任何类的每个实例进行唯一的初始化。如果您创建两个 Parent
实例并将它们修改为具有不同的值,您可以看到这一点:
p1 = Parent()
p2 = Parent()
p1.shared_variable = "foo"
print(p2.shared_variable) # still prints "I am a shared variable" here
如果您希望所有实例都引用同一变量,则需要使用在类的顶层、方法之外定义的类变量:
class Parent():
shared_variable_for_real = "I am a shared variable"
您仍然可以使用
self.shared_variable_for_real
查找此变量,但仅限于读取它。如果你想重新绑定共享变量,你必须使用Parent.shared_variable_for_real
。如果您尝试写入 self
上的属性,您将获得一个实例变量,就像使用当前代码一样。
请注意,子类的问题在这个问题中主要是一个转移注意力的问题。您可以从任何地方重新绑定
Parent.shared_variable_for_real
的值,包括 它的任何子类。如果您只是想重新绑定Parent
后代的一个分支的值,您可以写入
Child1.shared_variable_for_real
,这些实例可以看到它,但任何兄弟子类的实例都看不到。这似乎不是你想要的,所以我怀疑在任何地方使用
Parent.shared_variable_for_real
就是你想要的。