请参阅此示例以进行演示:
>>> 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'
为什么?
答案 0 :(得分:9)
您分配给test
的{{1}}方法未绑定到sample.test
对象。你需要像这样手动绑定它
sample
答案 1 :(得分:2)
函数是与任何其他函数一样的对象,无论名称在何处(即在本地名称空间中或作为对象上的属性),都需要对将名称分配给名称时发生的事情保持一致。
使用def
定义函数时,在def
之后将函数绑定到名称,当您执行some_object.f = my_function
之类的赋值时,您还将函数绑定到名称。分配过程中没有任何魔法可以改变函数的性质。
在类定义过程中是魔术。定义为实例方法的函数(即,在类定义中定义的函数)不是简单地作为实例的属性分配,而是使用descriptor绑定到实例。