我很好奇在字典突变的情况下继承是如何工作的,我一直认为每个新实例都会重新创建继承的类。
class A(object):
test = {"B": 0}
def change_test(self, index):
self.test["B"] += index
def __init__(self, **kwargs):
self.change_test(self.index)
super(A, self).__init__(**kwargs)
class B(A):
index = 1
def print_test(self):
print self.test
class C(A):
index = 2
def print_test(self):
print self.test
b = B()
b.print_test()
c = C()
c.print_test()
为什么这会返回{' B':1} {' B':3}而不是{' B':1} {' B':2}?
答案 0 :(得分:3)
类变量test
在A
及其子代的实例之间共享。
print A.test is B.test # True
print B.test is C.test # True
最初,test
是{"B": 0}
。
初始化b
时,系统会调用change_test
中的A
,因为B
会从A继承__init__
。现在test
为{"B": 1}
。之后,您初始化c
,这会导致另一个change_test
与index
的通话2.现在test
是{"B": 3}
,因为1 + 2 = 3。 / p>
答案 1 :(得分:2)
如前所述,变量是在import
- 时创建的,不会重新创建。此变量将被共享,因为dict
(但也list
,...)是可变的,也会被此类的所有实例更改。要解决此问题,请在实例创建时创建变量:
class A(object):
def change_test(self, index):
self.test["B"] += index
def __init__(self, **kwargs):
self.test = {"B": 0} # Create it here!!!
self.change_test(self.index)
super(A, self).__init__(**kwargs)
通常只保存不可变类型(int
,...)以将其用作类变量。
另见: