Python类继承和dict查找

Python类继承和dict查找,python,class,oop,inheritance,Python,Class,Oop,Inheritance,假设我定义了A类: >>> class A: ... a = 1 ... class SubA: ... sub_a = { 'a': 1, 'b': 1} 然后我定义了从A继承的类B: >>> class B(A): ... pass 现在,检查A的\uuuuuuuuuuuuuuuuu和B的\uuuuuuuuuuuuuu: >>> A.__dict__ {'a': 1, '__module__':

假设我定义了A类:

>>> class A:
...     a = 1
...     class SubA:
...         sub_a = { 'a': 1, 'b': 1}
然后我定义了从A继承的类B:

>>> class B(A):
...     pass
现在,检查A的\uuuuuuuuuuuuuuuuu和B的\uuuuuuuuuuuuuu

>>> A.__dict__
{'a': 1, '__module__': '__builtin__', '__doc__': None, 'SubA': <class __builtin_ _.SubA at 0x02CAA3E8>}
>>> B.__dict__
{'__module__': '__builtin__', '__doc__': None}
>>A.。\u dict__
{'a':1','uuuuu模块:''uuuu内置','uuuu文档:'uuuuu':无,'SubA':}
>>>B.。uu dict__
{“模块”:“内置”、“文档”:无}
不知何故,B.\uu dict\uuu既不包含'a'也不包含'SubA'。 现在如果我们这样做:

>>> A.a
1
>>> B.a
1

>>> A.SubA
<class __builtin__.SubA at 0x02CAA3E8>
>>> B.SubA
<class __builtin__.SubA at 0x02CAA3E8>
A.A 1. >>>文学学士 1. >>>苏巴 >>>苏巴 第一个问题:为什么B.uu dict\uuuu不包含'a''SubA'? 第二个问题:为什么B.a和B.SubA给出了预期的结果,尽管'a''SubA'都不在B

谢谢

Python就是这样工作的:

类具有由dictionary对象实现的命名空间。等级 属性引用被转换为此字典中的查找, e、 例如,
C.x
被翻译成
C.\uu dict\uuuu[“x”]
(尽管对于新样式 类,尤其是有许多钩子允许 定位属性的其他方法)。当属性名称不是 在那里,属性搜索将在基类中继续

@波特已经给出了答案,我只想探讨一下原因:

如果您的类变量位于
B.\uuu dict\uuu
中,它将如何工作?每个子类对于
a
都有自己的值,独立于
a.a
的值-这不是您所期望的。类变量应该在该类中存在一次


相反,Python对类进行查找,如果它不存在,则查找其基类-注意,这意味着可以在子类中隐藏类变量。

本质上,它首先尝试解析子类中的名称,然后它的每一个超类,然后每一个超类,等等,直到它解决或者它不。。。至少我认为这样做
dir(B)
会揭示父类属性的优点。现在,如果我想覆盖类成员:B.a=2做这个工作,现在B.。\u dict\u有'a'。但是,B.SubA.sub_a=a.SubA.sub_a.copy()没有帮助,因为如果我更新B.SubA.sub_a,a.SubA.sub_a也会更新。是因为在此之前必须覆盖SubA吗?是的
B.SubA
A.SubA
在这种情况下是相同的。一般来说,Python中很少看到内部类型,因为它们没有提供太多的功能或价值。我发现有时可能需要使用它,比如在Django ModelForms中,当您有一个元子类并希望重写其成员时。