Python类继承和__dict__查找[重复]

发布于 2021-01-29 14:56:21

这个问题已经在这里有了答案

python只获取类属性没有超类 (3个答案)

6年前关闭。

假设我定义了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


谢谢!

关注者
0
被浏览
102
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    @bgporter对该行为进行了很好的解释,我将介绍其中的
    原因

    如果您的类变量位于中B.__dict__,它将如何起作用?每个子类都有其自己的值a,而与的值无关A.a-这不是您所期望的。一个类变量应该只存在一次-
    在该类中。

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看