为什么types.MethodType会抱怨太多参数?

时间:2013-12-12 09:54:03

标签: python

>>> 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个

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__ 绑定到实例。