【发布时间】:2015-01-25 03:20:33
【问题描述】:
我的问题是如何在属性查找时将function 对象转换为绑定或未绑定instancemethod。具体来说,我对暗示 function 对象的行为感兴趣,尽管它是一个描述符,但实际上并没有被这样对待。对于以下内容,请假设 Python 2。
Python 中用户定义的函数对象实现了描述符接口。也就是一个函数对象有一个__get__方法:
>>> def bar(): return 42
>>> bar.__get__
<method-wrapper '__get__' of function object at 0x104b2eaa0>
我的理解是,method-wrapper 是一个 cPython 特有的类型,它创建一个未绑定或绑定的方法对象,将 bar 关联到一个类或实例:
>>> class Foo(object): pass
>>> bar.__get__(None, Foo)
<unbound method Foo.bar>
现在开始写
>>> Foo.bar = bar
具有将bar函数对象添加到Foo.__dict__的效果。而且由于bar是一个描述符,所以写
>>> Foo.bar
调用
>>> Foo.__dict__["bar"].__get__(None, Foo)
<unbound method Foo.bar>
我的问题本质上是最后一个说法是否属实。 Foo.bar 真的 打电话给Foo.__dict__["bar"].get__(None, Foo) 吗?以下似乎是相反的证据:我们可以将bar 的__get__ 属性替换为绝对不是 method-wrapper 的东西,并且它不会改变函数的方式边界。例如,
>>> def bar(): return 42
>>> bar.__get__ = "This won't bind bar to anything"
>>> class Foo(object): pass
>>> Foo.bar = bar
>>> Foo.bar
<unbound method Foo.bar>
>>> Foo.__dict__["bar"].__get__
"This won't bind bar to anything"
所以bar 尽管是一个描述符,但似乎不像一个那样使用。
这是我对写Foo.bar 时实际发生的情况的猜测:解释器在Foo.__dict__ 中找到函数对象bar。它不会像使用任何其他描述符那样调用bar.__get__,而是执行仅由function 对象调用的特殊行为:它会根据需要自动将function 包装在未绑定或绑定的方法对象中。
我的问题是:
- 我关于
function对象在属性访问时如何转换为方法对象的理论准确吗? - 一般来说,这是如何实现的?如果和我猜的一样,除了
function对象之外,还有其他类型得到特殊处理吗? - 如果我想了解更多信息,这些记录在哪里?
【问题讨论】:
标签: python python-2.7