为什么在实例属性查找中没有搜索元类的属性?

时间:2016-07-27 15:17:15

标签: python attributes metaclass python-internals getattribute

根据Python 2.7.12文档,3.4.2.3。调用描述符¶:

  

属性访问的默认行为是获取,设置或删除   来自对象字典的属性。例如,a.x有一个   查找链以a.__dict__['x']开头,然后   type(a).__dict__['x'],并继续通过基类   type(a) 不包括元类

但为什么会排除元类?

如果您不断调用type(self),无论self是什么,实例对象还是类型对象,您最终都会获得<type 'type'>。所以我无法理解为什么元类会享受这种“特权”。

顺便说一句,我对这个引用感到有些困惑:例如,对象使用object.__getattribute__,所以我认为查找链应如下所示:

  • a.__dict__['x']
  • type(a).__dict__['x']
  • b.__dict__[x]代表b
  • 中的type(a).__mro__
  • type(b).__dict__[x]代表b
  • 中的type(a).__mro__
  • c.__dict__[x]代表c
  • 中的type(b).__mro__
  • ......

我是对的吗?

1 个答案:

答案 0 :(得分:1)

这是因为属性查找搜索type(a)type(a).__mro__)的所有基础,而不是type(a)的所有类型type(type(a)))。

此外,type(self)不会连续调用,因此查找链如下所示:

  • a.__dict__['x']
  • type(a).__dict__['x']
  • b.__dict__[x] for b in type(a).__mro__
  • raise AttributeError

正如@jsbueno在评论中明智地指出的那样,第二步实际上包含在第三步中。这是因为对于任何一个班级,让我们说班级CC本身就是C.__mro__中的第一个项目。