Python类继承和dict查找
假设我定义了A类: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__':
>>> 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中,当您有一个元子类并希望重写其成员时。