从类外的现有方法创建staticmethod?("未绑定方法"错误)

Wil*_*ell 5 python

在定义类之后,如何使类方法保持静态?换句话说,为什么第三种情况会失败?


>>> class b:
...  @staticmethod
...  def foo():
...   pass
...
>>> b.foo()
>>> class c:
...  def foo():
...   pass
...  foo = staticmethod( foo )
...
>>> c.foo()
>>> class d:
...  def foo():
...   pass
...
>>> d.foo = staticmethod( d.foo )
>>> d.foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method foo() must be called with d instance as first argument (got nothing instead)

kin*_*all 6

定义类之后,foo是一个未绑定的方法对象(将函数绑定到类的包装器),而不是函数.包装器将尝试将class(self)的实例作为第一个参数传递给函数,因此它会抱怨您没有给它一个.

staticmethod()应该只用于函数.虽然仍然定义了类(在你的b和中c)foo()仍然是一个函数,因为在类定义完成时应用了方法包装器.

可以从未绑定的方法对象中提取函数,应用staticmethod()并将其分配回类.

class d(object):
    def foo():
       pass

d.foo = staticmethod(d.foo.im_func)
Run Code Online (Sandbox Code Playgroud)

在Python 3中,没有未绑定的实例方法(存储在类上的方法是普通函数).因此,您的原始代码实际上可以在Python 3上正常工作.

适用于Python 2和Python 3的方法是:

d.foo = staticmethod(d.__dict__['foo'])
Run Code Online (Sandbox Code Playgroud)

(它还避免了创建和丢弃方法包装器.)


Ign*_*ams 5

您必须传递函数,而不是未绑定的方法.

>>> class d:
...   def foo():
...     pass
... 
>>> d.foo = staticmethod(d.foo.im_func)
>>> d.foo()
Run Code Online (Sandbox Code Playgroud)