为什么猴子修补方法没有传递给实例的引用?

时间:2014-04-15 02:36:24

标签: python oop python-3.x self monkeypatching

请参阅此示例以进行演示:

>>> class M:
       def __init__(self): self.x = 4
>>> sample = M()
>>> def test(self):
        print(self.x)
>>> sample.test = test
>>> sample.test()
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    sample.test()
TypeError: test() missing 1 required positional argument: 'self'

为什么?

2 个答案:

答案 0 :(得分:9)

您分配给test的{​​{1}}方法未绑定到sample.test对象。你需要像这样手动绑定它

sample

答案 1 :(得分:2)

函数是与任何其他函数一样的对象,无论名称在何处(即在本地名称空间中或作为对象上的属性),都需要对将名称分配给名称时发生的事情保持一致。

使用def定义函数时,在def之后将函数绑定到名称,当您执行some_object.f = my_function之类的赋值时,您还将函数绑定到名称。分配过程中没有任何魔法可以改变函数的性质。

在类定义过程中魔术。定义为实例方法的函数(即,在类定义中定义的函数)不是简单地作为实例的属性分配,而是使用descriptor绑定到实例。