通过类上定义的实例访问函数时,每次都会创建一个 绑定方法
对象。从文档:
调用方法时到底发生了什么?您可能已经注意到
x.f()上面调用了不带参数的方法,即使f()指定了参数的函数定义也是如此。争论发生了什么?当没有任何参数调用需要参数的函数时,Python当然会引发异常-
即使该参数并未实际使用。实际上,您可能已经猜到了答案:方法的特殊之处在于,实例对象作为函数的第一个参数传递。在我们的示例中,该调用
x.f()与完全等效MyClass.f(x)。通常,调用带有n个参数列表的方法等效于调用带有参数列表的函数,该参数列表是通过在第一个参数之前插入方法的实例对象而创建的。如果您仍然不了解方法的工作方式,那么看一下实现也许可以澄清问题。 当引用的实例属性不是数据属性时,将搜索其类。
如果名称表示作为函数对象的有效类属性,则通过将实例对象和刚在抽象对象中一起找到的函数对象打包(指向)来创建方法对象:这是方法对象。
请注意, 每次您访问方法 时 都会 发生这种情况:
>>> class Foo:... def bar(self): pass...>>> f = Foo()>>> f.bar is f.barFalse
这是如何运作的?好吧,实际上,函数
是描述符对象 ,请注意a的存在
__get__:
>>> def func(): pass...>>> func.__get__<method-wrapper '__get__' of function object at 0x101e38ae8>
换句话说,您可以认为Python函数是这样实现的:
class Function(object): . . . def __get__(self, obj, objtype=None): "Simulate func_descr_get() in Objects/funcobject.c" if obj is None: return self return types.MethodType(self, obj)
当然,它们不是在Python中实现的(至少在CPython中!)。
还要注意,直接在类上访问函数当然不会这样做(至少在Python 3上,您已在问题上对其进行了标记):
>>> Foo.bar is Foo.barTrue



