>>> import types
>>> class Foo:
... def say(self):
... print("Foo say")
...
>>> class Bar:
... def say(self):
... print("Bar say")
...
>>> f = Foo()
>>> b = Bar()
>>> types.MethodType(f.say, b)()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: say() takes 1 positional argument but 2 were given
我只是想知道我给出的两个论点是什么?我知道其中一个是self
,但另一个是什么?
当然,在这个例子中,正确的方法是:
>>> types.MethodType(Foo.say, b)()
Foo say
但我问的是types.MethodType(f.say, b)()
的错误。我想知道为什么抱怨
需要1个位置参数,但是给出了2个
答案 0 :(得分:2)
在任何方法调用中,第一个参数是对象本身作为隐式参数。在您的情况下,示例
types.MethodType(f.say, b)()
翻译为
f.say(b)
进一步转化为
say(f, b)
所以最终你最终发送了两个参数
答案 1 :(得分:1)
这样做的正确方法是:
import types
class Foo:
def say(self):
print("Foo say")
class Bar:
def say(self):
print("Bar say")
f = Foo()
b = Bar()
types.MethodType(Foo.say.__func__, b)()
您必须将功能 Foo.say.__func__
绑定到实例。