我们说我定义了A类:
>>> class A:
... a = 1
... class SubA:
... sub_a = { 'a': 1, 'b': 1}
然后我定义继承自A:
的B类>>> class B(A):
... pass
现在,检查A的 __ dict __ 和B的 __ dict __ :
>>> A.__dict__
{'a': 1, '__module__': '__builtin__', '__doc__': None, 'SubA': <class __builtin_ _.SubA at 0x02CAA3E8>}
>>> B.__dict__
{'__module__': '__builtin__', '__doc__': None}
不知何故, B .__ dict __ 既不包含&#39; <#39; 也不包含&#39; SubA&#39; 。 现在,如果我们这样做:
>>> A.a
1
>>> B.a
1
>>> A.SubA
<class __builtin__.SubA at 0x02CAA3E8>
>>> B.SubA
<class __builtin__.SubA at 0x02CAA3E8>
第一个问题: B .__ dict __ 为什么不包含&#39; 和&#39; SubA&#39; ? 第二个问题:为什么Ba和B.SubA都给出了预期的结果,尽管&#39; 和&#39; SubA&#39; 都不在< strong> B &#39; __ dict __ ?
谢谢!
答案 0 :(得分:7)
@bgporter给了a good explanation of the behaviour,我只是进入为什么:
如果您的类变量位于B.__dict__
,它将如何运作?每个子类都有a
自己的值,与A.a
的值无关 - 这不是您所期望的。类变量应该存在一次 - 在该类中。
相反,Python对类进行查找,如果它不存在,则查找它的基类 - 注意这意味着可以在子类中隐藏类变量。
答案 1 :(得分:5)
这就是Python object model的工作原理:
类具有由字典对象实现的命名空间。类 属性引用被转换为此字典中的查找, 例如,
C.x
被翻译为C.__dict__["x"]
(尽管是新式的 特别是类有许多允许的钩子 其他定位属性的方法)。当属性名称不是 在那里找到,属性搜索在基类中继续。