You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中@staticmethod装饰器与直接调用staticmethod的效果差异

问题产生原因

staticmethod是Python内置的描述符类型,它的生效逻辑依赖Python的属性查找协议:
当staticmethod包装的函数作为类属性存储时,通过类或者实例访问该属性,会自动触发描述符的__get__方法,返回可直接调用的原始函数,你写的WithDec类就是这种场景,所以调用正常。
当你把staticmethod对象直接赋值给实例属性时,实例属性的访问逻辑不会触发描述符的__get__方法,你直接拿到的是staticmethod对象本身,该对象原生没有实现可调用逻辑,所以会抛出'staticmethod' object is not callable的报错。

解决方法

根据你的使用场景,最简便的方案是直接取消staticmethod包装,直接把传入的函数赋值给实例属性即可:

class WithoutDec():
    def __init__(self, stat):
        # 不需要包staticmethod,直接赋值即可
        self.stat = stat

修改后调用WithoutDec(OuterStat).stat(2)即可正常返回3,完全符合你的使用需求。

如果确实需要该方法作为全局生效的类静态方法,可以将其绑定到类属性而非实例属性:

class WithoutDec():
    def __init__(self, stat):
        # 绑定到类属性,会触发描述符协议
        self.__class__.stat = staticmethod(stat)

注意该方案下所有实例共享同一个静态方法,后创建的实例会覆盖之前的方法定义。

内容的提问来源于stack exchange,提问作者LastedApple3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 07:45:01