我对继承中的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'}
答案 0 :(得分:3)
通常,您不希望使用可变类变量。类变量由对象引用共享给类的所有实例。但它不是在继承的类之间共享。
因此a
的所有实例都会共享对a.var1
和a.var2
的对象引用。同样,b
的所有实例都共享对b.var1
和b.var2
的对象引用。创建继承后,b
也会获得对var1
和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'}