Python类继承和__dict__查找

时间:2014-05-07 23:01:49

标签: python class oop inheritance

我们说我定义了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 __

谢谢!

2 个答案:

答案 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"](尽管是新式的   特别是类有许多允许的钩子   其他定位属性的方法)。当属性名称不是   在那里找到,属性搜索在基类中继续。