【发布时间】:2017-12-09 19:59:14
【问题描述】:
Python in a Nutshell 描述了获取属性时的查找过程。本书区分了两种情况
-
从类中获取属性时的查找过程,例如
cls.name从类中获取属性
当您使用语法
C.name来引用属性时 在类对象C上,查找分两步进行:当
name是C.__dict__中的键时,C.name从C.__dict__['name']获取值v。然后,当v是 一个描述符(即type(v)提供一个名为__get__),C.name的值是调用的结果type(v).__get__(v, None, C)。当v不是描述符时,C.name is v的值。当
name不是C.__dict__中的键时,C.name将查找委托给C的基类,这意味着它在C的基类上循环 祖先类并尝试对每个类进行名称查找(在方法中 解决顺序,如页面上的“方法解决顺序”中所述 113).
the lookup procedure when getting an attribute from an instance, e.g.
obj.name
由于在 Python 3 中,每个类对象实际上都是其元类的一个实例(例如type 类),根据本书,为什么从类中获取属性的查找过程和获取属性的查找过程是来自不同实例的属性?
【问题讨论】:
标签: python python-3.x class attributes metaclass