【发布时间】:2014-09-11 21:08:42
【问题描述】:
根据本指南关于 python 描述符 https://docs.python.org/howto/descriptor.html
新样式类中的方法对象是使用描述符实现的,以避免在属性查找中对它们进行特殊封装。
我的理解是有一种方法对象类型实现__get__,并在使用实例调用时返回绑定的方法对象,在没有实例且仅使用类调用时返回未绑定的方法对象。文章还指出,这个逻辑是在object.__getattribute__ 方法中实现的。像这样:
def __getattribute__(self, key):
"Emulate type_getattro() in Objects/typeobject.c"
v = object.__getattribute__(self, key)
if hasattr(v, '__get__'):
return v.__get__(None, self)
return v
然而object.__getattribute__ 本身就是一种方法!那么它如何绑定到一个对象(没有无限递归)?如果它在属性查找中是特殊大小写的,这不会破坏删除旧样式特殊大小写的目的吗?
【问题讨论】:
-
"我的理解是有一个方法对象类型实现了 get" => 实际上,这里的描述符是
function类型(cf wiki.python.org/moin/FromFunctionToMethod).
标签: python attributes python-internals