python 3.3 documentation告诉我应该可以直接访问属性描述符,尽管我对它的语法x.__get__(a)
表示怀疑。但我在下面构建的例子失败了。我错过了什么?在
class MyDescriptor(object):
"""Descriptor"""
def __get__(self, instance, owner):
print "hello"
return 42
class Owner(object):
x = MyDescriptor()
def do_direct_access(self):
self.x.__get__(self)
if __name__ == '__main__':
my_instance = Owner()
print my_instance.x
my_instance.do_direct_access()
以下是我在Python2.7(以及移植代码片段后的Python3.2)中遇到的错误。这个错误消息对我来说是有意义的,但是文档中说的似乎不是这样的。在
^{pr2}$
通过访问
self
上的描述符,您已经调用了__get__
。返回值42
。在对于任何属性访问,Python都会查看对象的类型(这里是
type(self)
)以查看是否存在描述符对象(例如,具有.__get__()
方法的对象),然后调用该描述符。在方法就是这样工作的;找到一个函数对象,它有一个
.__get__()
方法,该方法被调用并返回一个绑定到self的方法对象。在如果要直接访问描述符,则必须绕过此机制;访问
__dict__
字典中的x
:在您看到
x.__get__(a)
直接调用的地方,就记录了这种行为:文档中的直接调用场景仅适用于直接引用描述符对象(未调用);
Owner.__dict__['x']
表达式就是这样一个引用。在另一方面,您的代码是实例绑定场景的一个示例:
相关问题 更多 >
编程相关推荐