根据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__
我是对的吗?
答案 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在评论中明智地指出的那样,第二步实际上包含在第三步中。这是因为对于任何一个班级,让我们说班级C
,C
本身就是C.__mro__
中的第一个项目。