装饰器 · classmethod

0. 一句话定位

维度 内容
作用对象 类方法
使用场景 方法绑定
来源 标准库 builtins.classmethod
语法形式 @classmethod

1. 做什么

第一个参数为类本身 cls(非实例 self);可通过 类名.方法() 调用,无需先实例化;可访问类属性、调用其他类方法、构造实例。

2. 重点参数

参数 类型 默认值 作用 配置建议
无参装饰器 直接 @classmethod 置于方法上方

被装饰方法签名:第一个参数必须为 cls(命名可改,约定用 cls)。

3. 最小可运行示例

1
2
3
4
5
6
7
8
9
10
11
12
13
class A:
bar = 1

def func1(self):
print("foo")

@classmethod
def func2(cls):
print("func2")
print(cls.bar)
cls().func1() # 通过 cls() 创建实例再调实例方法

A.func2()
1
2
3
func2
1
foo

4. 常见变体

替代构造器(工厂方法)

1
2
3
4
5
6
7
8
9
10
11
class Date:
def __init__(self, year, month, day):
self.year, self.month, self.day = year, month, day

@classmethod
def from_string(cls, s):
y, m, d = map(int, s.split("-"))
return cls(y, m, d)

d = Date.from_string("2026-08-03")
print(d.year) # 2026

5. 适用 / 不适用

适用

  • 需要替代构造函数或多种构造路径
  • 逻辑依赖类状态、子类多态(cls 指向实际调用类)

不适用

  • 完全不访问类/实例,仅做工具函数 → 用 @staticmethod
  • 必须访问实例状态 → 普通实例方法

6. 易踩坑

  • 实例上也可调用 obj.func2(),但 cls 仍是类型,不是实例
  • @property 不能叠在同一方法上

7. 近邻替代

替代 何时用
@staticmethod 不需要 cls,也不访问实例
模块级函数 与类无关的纯函数

8. 参考

-------------本文结束感谢您的阅读-------------