【发布时间】:2017-12-08 08:54:43
【问题描述】:
简而言之,来自 Python
从实例中获取属性
当您使用语法
x.name来引用C类的实例x,查找分三步进行:
当在
C(或C的祖先类之一)中找到name作为覆盖描述符v的名称时(即,type(v)提供方法__get__和__set__)•
x.name的值是type(v).__get__(v, x, C)的结果否则,当
name是x.__dict__中的键时•
x.name获取并返回x.__dict__['name']处的值否则,
x.name将查找委托给x的类(根据与C.name相同的两步查找,就像刚才 详细)• 当找到描述符
v时, 属性查找同样是type(v).__get__(v, x, C)• 当找到非描述符值
v时,总 属性查找的结果就是v当这些查找步骤未找到属性时,Python 会引发
AttributeError异常。但是,对于x.name的查找,当C定义或继承特殊的 方法__getattr__,Python 调用C.__getattr__(x,'name')而不是提升 例外。然后由__getattr__返回合适的值或提高 适当的例外,通常是AttributeError。
步骤 1 和步骤 3 的第一部分是否相同?如果是,为什么同一个步骤会出现两次?
当
name在C(或C的祖先类之一中)作为覆盖描述符v的名称时,它们是否都会发生“ em>?
__getattribute__(self, name)在每个访问属性
x.y的请求中,Python 调用x.__getattribute__('y'),必须获取并返回属性 价值或提高AttributeError。的正常语义 属性访问(使用x.__dict__、C.__slots__、C的类 属性,x.__getattr__) 都归功于object.__getattribute__。 当C类覆盖__getattribute__时,它必须实现所有 它想要提供的属性访问语义。大多数时候,最 实现属性访问语义的便捷方法是 委派(例如,调用object.__getattribute__(self, ...)作为一部分__getattribute__的覆盖操作)。
【问题讨论】:
标签: python python-3.x