我们说我有以下父母和子课程:
class A(object):
def __init__(self, *args, **kwargs):
self.a = kwargs.get('a', 'default_A')
self.b = kwargs.get('b', 'default_B')
class B(A):
a = "override_A"
def __init__(self, *args, **kwargs):
super(B, self).__init__(**kwargs)
b = B()
print b.b # this is "default_B", as expected
print b.a # I expected this to be "override_A"
我在这里做错了什么?我试图通过像this one这样的答案来了解继承是如何运作的,但却没有找到描述这一特定要求的东西。
答案 0 :(得分:7)
您正在混合类和实例变量。 B.a
是一个类变量,它被A.__init__()
中设置的实例变量遮蔽。
例如,您可以使用dict.setdefault()
:
class B(A):
def __init__(self, *args, **kwargs):
# If the key 'a' exists, this'll be effectively no-operation.
# If not, then 'a' is set to 'override_A'.
kwargs.setdefault('a', 'override_A')
super(B, self).__init__(**kwargs)