Python静态方法继承场景下不使用self调用当前类变量的实现方案
Python静态方法访问当前调用类变量的解决方案
问题本质
@staticmethod 装饰的静态方法不会接收隐式的类或实例作为输入参数,因此你在方法内硬编码 A.var 时,无论通过父类还是子类调用该方法,永远只会访问父类A的属性,无法适配子类重写类属性的场景。
解决方案
将静态方法替换为@classmethod装饰的类方法即可,类方法的第一个参数会自动传入实际调用该方法的类对象(通常命名为cls),不需要修改原有调用方式就能实现你要的效果。
修改后的代码如下:
class A: var = 0 lst = [100, 200, 300] @classmethod def static_function(cls): print(cls.var, cls.lst) # 用cls代替硬编码的类名,自动指向当前调用的类 def class_function(self): print(self.__class__.var, self.__class__.lst) class B(A): var = 9 lst = [999, 999, 999] if __name__ == '__main__': B.static_function() # 输出:9 [999, 999, 999] 符合预期 B().class_function() # 输出:9 [999, 999, 999]
补充说明
- 类方法和静态方法的调用方式完全一致,都支持直接通过类名调用、通过实例调用
- 仅当方法逻辑完全不需要访问任何类属性、实例属性时,才适合使用
@staticmethod,其余需要关联类上下文的场景优先使用@classmethod
内容的提问来源于stack exchange,提问作者Chumicat
相关产品推荐
相关产品推荐

