在Python中从子类更新父类变量

问题描述 投票:0回答:1

下面的代码有两个类,我正在尝试从

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
python inheritance
1个回答
0
投票

尽管有它的名字,但您在

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
 就是你想要的。

© www.soinside.com 2019 - 2024. All rights reserved.