0. 一句话定位
| 维度 | 内容 |
|---|---|
| 作用对象 | 类方法 |
| 使用场景 | 方法绑定 |
| 来源 | 标准库 builtins.classmethod |
| 语法形式 | @classmethod |
1. 做什么
第一个参数为类本身 cls(非实例 self);可通过 类名.方法() 调用,无需先实例化;可访问类属性、调用其他类方法、构造实例。
2. 重点参数
| 参数 | 类型 | 默认值 | 作用 | 配置建议 |
|---|---|---|---|---|
| — | — | — | 无参装饰器 | 直接 @classmethod 置于方法上方 |
被装饰方法签名:第一个参数必须为 cls(命名可改,约定用 cls)。
3. 最小可运行示例
1 | class A: |
1 | func2 |
4. 常见变体
替代构造器(工厂方法)
1 | class Date: |
5. 适用 / 不适用
适用
- 需要替代构造函数或多种构造路径
- 逻辑依赖类状态、子类多态(
cls指向实际调用类)
不适用
- 完全不访问类/实例,仅做工具函数 → 用
@staticmethod - 必须访问实例状态 → 普通实例方法
6. 易踩坑
- 实例上也可调用
obj.func2(),但cls仍是类型,不是实例 - 与
@property不能叠在同一方法上
7. 近邻替代
| 替代 | 何时用 |
|---|---|
@staticmethod |
不需要 cls,也不访问实例 |
| 模块级函数 | 与类无关的纯函数 |