在定义类之后,如何使类方法保持静态?换句话说,为什么第三种情况会失败?
>>> 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)
定义类之后,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)
(它还避免了创建和丢弃方法包装器.)
您必须传递函数,而不是未绑定的方法.
>>> class d:
... def foo():
... pass
...
>>> d.foo = staticmethod(d.foo.im_func)
>>> d.foo()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |