首页 > 解决方案 > 在 Python 继承中共享类变量

问题描述

我对继承中 Python 中的变量共享概念感到困惑。

考虑以下代码:-

class a(object):
    var1 = 0
    var2 = {}
    def print_var(self):
        print(self.var1)
        print(self.var2)

class b(a):
    @classmethod
    def modify_var(cls):
        cls.var1 = 1
        cls.var2['temp']="something"

o1 = a()
o2 = b()
print("Initial Values")
o1.print_var()
o2.print_var()
print("Changing Values")
o2.modify_var()
print("Print values after change")
o1.print_var()
o2.print_var()

运行上面的代码后,我可以看到字典在子类和父类之间共享,但整数变量不是。

谁能解释一下,或者我在这里做错了什么?

上述代码的输出:

Initial Values
0
{}
0
{}
Changing Values
Print values after change
0    # <- this zero should be one according to my understanding
{'temp': 'something'}
1
{'temp': 'something'}

标签: pythoninheritance

解决方案


通常,您不想使用可变类变量。类变量由对类的所有实例的对象引用共享。但它不会在继承的类之间共享。

所以共享对象的所有实例都a引用a.var1a.var2。类似地,所有b共享对象的实例都引用b.var1b.var2。在创建继承时,b还获取对var1and的引用var2,但它们不会共享回a或任何实例化a.

因为你使用了一个可变对象var2,所以继承后对象的引用永远不会改变。所以你可以修改var2它,它会被所有对它的引用修改,因为对象引用是相同的。

如果您重新分配var2而不是修改它,您将获得预期的行为。

试试这个:

class a(object):
    var1 = 0
    var2 = {}
    def print_var(self):
        print(self.var1, end=', ')
        print(self.var2)

class b(a):
    @classmethod
    def modify_var(cls):
        cls.var1 = 1
        cls.var2 = {'temp': 'something'}  # reassign to a new dict

以下是一些测试:

ob1 = a()
ob2 = b()

o1.print_var()
o2.print_var()

o2.modify_var()

o1.print_var()
o2.print_var()

# prints
0, {}
0, {}
0, {}
1, {'temp': 'something'}

推荐阅读