方法对象
通常,方法在绑定后立即被调用:
x.f()
在 MyClass 示例中,这将返回字符串 'hello world'。 但是,方法并不是必须立即调用: x.f 是一个方法对象,它可以被保存起来以后再调用。 例如:
xf = x.f
while True:
print(xf())
将持续打印 hello world,直到结束。
当一个方法被调用时究竟会发生什么? 你可能已经注意到尽管 f() 的函数定义指定了一个参数,但上面调用 x.f() 时却没有带参数。 这个参数发生了什么事? 当一个需要参数的函数在不附带任何参数的情况下被调用时 Python 肯定会引发异常 --- 即使参数实际上没有被使用...
实际上,你可能已经猜到了答案:方法的特殊之处就在于实例对象会作为函数的第一个参数被传入。 在我们的示例中,调用 x.f() 其实就相当于 MyClass.f(x)。 总之,调用一个具有 n 个参数的方法就相当于调用再多一个参数的对应函数,这个参数值为方法所属实例对象,位置在其他参数之前。
如果你仍然无法理解方法的运作原理,那么看了实现细节可能会弄清楚问题。当对实例对象进行属性引用时,如果该属性在实例中无法找到,将搜索实例所属的类。如果被引用的属性名称表示一个有效的类属性中的函数对象,会打包两者(实例对象和查找到的函数对象)的指针到一个抽象对象,这个抽象对象就是方法对象。当用参数列表调用方法对象时,将基于实例对象和参数列表构建一个新的参数列表,并用这个新参数列表调用相应的函数对象。
|