【问题标题】:Why does types.MethodType complain too many arguments?为什么 types.MethodType 抱怨参数太多?
【发布时间】:2013-12-12 09:54:03
【问题描述】:
>>> 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

我只是想知道我给出的 2 个论点是什么?我知道其中一个是self,但另一个是什么?

当然,在这个例子中,正确的方法是:

>>> types.MethodType(Foo.say, b)()
Foo say

但我问的是types.MethodType(f.say, b)() 的错误。我想知道它为什么抱怨

接受 1 个位置参数,但给出了 2 个

【问题讨论】:

    标签: python


    【解决方案1】:

    在任何方法调用中,第一个参数是对象本身作为隐式参数。在您的情况下,示例

    types.MethodType(f.say, b)()
    

    翻译成

    f.say(b)
    

    进一步转化为

    say(f, b)
    

    所以最终你最终发送了两个参数

    【讨论】:

    • 那么,如何解决这个问题?
    【解决方案2】:

    这样做的正确方法是:

    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__ 到一个实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 2015-06-09
      • 2020-08-12
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多