静态方法不能使用self,必须用类名显式访问静态变量或方法;推荐优先使用@classmethod,它自动接收cls参数,支持继承且更灵活。

在类的静态方法中调用本类的其他静态变量或静态方法,直接使用 类名 或 self(推荐)即可,无需实例化对象。关键在于:静态方法不接收 self 或 cls 参数,但它内部仍可通过 self 访问?不,等等——这里要特别注意一个常见误区:
静态方法不能直接用 self,必须用类名或 cls(但需显式传入)
静态方法(@staticmethod)本质上是“挂”在类上的普通函数,它**不自动接收任何隐式参数**(既不是实例 self,也不是类 cls)。因此:
- ❌ 不能写
self.xxx或self.some_static_method()—— 会报NameError: name 'self' is not defined - ✅ 正确方式是:用 类名显式访问,如
MyClass.static_var或MyClass.helper_method() - ✅ 或者改用 类方法(
@classmethod),它自动接收cls参数,更灵活且支持继承
推荐方案:优先考虑 @classmethod 而非 @staticmethod
除非你真需要一个完全与类解耦、不依赖任何类属性/方法的工具函数,否则大多数“想在静态上下文中调用本类静态成员”的场景,更适合用 @classmethod:
class MathUtils:
PI = 3.14159
SCALE = 2
<pre class="brush:php;toolbar:false;">@classmethod
def circle_area(cls, r):
return cls.PI * r * r # ✅ 通过 cls 访问静态变量
@classmethod
def scaled_area(cls, r):
return cls.circle_area(r) * cls.SCALE # ✅ 调用本类其他类方法
@staticmethod
def legacy_calc(r):
# ❌ self 不存在;✅ 只能硬编码类名
return MathUtils.PI * r * r * 2
如果坚持用 @staticmethod:只能硬编码类名
这是唯一安全的方式,缺点是类名变更时需手动同步修改,且不支持子类重写静态变量:
- 调用静态变量:
MyClass.MY_CONSTANT - 调用静态方法:
MyClass.another_static_method(...) - 避免使用
globals().get('MyClass')或字符串导入等非常规手段——可读性差、易出错
小结:选对装饰器,少踩坑
想调用本类静态成员?别死守 @staticmethod。90% 的情况,@classmethod 更合适:它保持了类上下文,支持继承,写法清晰,维护成本低。只有当你确认该逻辑和当前类完全无关(比如一个通用字符串处理函数),才用 @staticmethod,并老老实实用类名调用。

















