>> class b:... @staticmethod... def foo():... pass...>>> b.fo-6ren">
gpt4 book ai didi

python - 从类外的现有方法创建静态方法? ("unbound method"错误)

转载 作者:太空狗 更新时间:2023-10-30 00:37:06 25 4
gpt4 key购买 nike

如何在类定义后使类方法静态化?也就是说,为什么第三种情况会失败呢?

>>> 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是一个未绑定(bind)的方法对象(将函数绑定(bind)到类的包装器),而不是函数。包装器将尝试将类的实例 (self) 作为第一个参数传递给函数,因此它会提示您没有给它一个。

staticmethod() 实际上应该只与函数一起使用。虽然该类仍在定义中(如在您的 bc 中),但 foo() 仍然是一个函数,因为应用了方法包装器当类定义完成时。

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

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

d.foo = staticmethod(d.foo.im_func)

在 Python 3 中,没有未绑定(bind)的实例方法(存储在类中的方法是普通函数)。所以您的原始代码实际上可以在 Python 3 上正常运行。

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

d.foo = staticmethod(d.__dict__['foo'])

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

关于python - 从类外的现有方法创建静态方法? ("unbound method"错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8919866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com