假设我定义了A类:
>>> class A: ... a = 1 ... class SubA: ... sub_a = { 'a': 1, 'b': 1}
然后定义从A继承的类B:
>>> class B(A): ... pass
现在,检查 dict A和 dict B的:
>>> A.__dict__ {'a': 1, '__module__': '__builtin__', '__doc__': None, 'SubA': <class __builtin_ _.SubA at 0x02CAA3E8>} >>> B.__dict__ {'__module__': '__builtin__', '__doc__': None}
不知何故, B .__ dict__不 包含 ‘a’ 或 ‘SubA’ 。现在,如果我们这样做:
>>> A.a 1 >>> B.a 1 >>> A.SubA <class __builtin__.SubA at 0x02CAA3E8> >>> B.SubA <class __builtin__.SubA at 0x02CAA3E8>
第一个问题:为什么 B . dict 不包含 ‘a’ 和 ‘SubA’ ?第二个问题:为什么Ba和B.SubA产生预期的结果,虽然没有 “一” ,也没有 “速霸” 是在 乙 的 dict ?
谢谢!
@bgporter对该行为进行了很好的解释,我将介绍其中的 原因 :
如果您的类变量位于中B.__dict__,它将如何起作用?每个子类都有其自己的值a,而与的值无关A.a-这不是您所期望的。一个类变量应该只存在一次- 在该类中。
B.__dict__
a
A.a
相反,Python在该类上进行查找,如果不存在,则查找其基类-注意,这意味着可以在子类中隐藏类变量。