Python 类方法与静态方法
Python 实例方法、类方法和静态方法的区别、调用方式与使用场景。
@classmethod 定义类方法,自动接收当前类 cls。
@staticmethod 定义静态方法,不自动接收类或对象。
实例方法通过对象调用时,自动接收该对象 self。
差异一览
| 方法 | 自动接收 | 适合的需求 |
|---|---|---|
| 实例方法 | 从对象调用时,接收该对象 self | 处理这个对象的数据 |
| 类方法 | 接收当前调用的类 cls | 使用当前类的属性或行为 |
| 静态方法 | 不自动接收对象或类 | 处理明确给出的参数 |
self、cls 是惯用参数名,不是关键字。自动传参规则见官方的方法对照。
同一个类,三种写法
以下示例基于 Python 3.13,按顺序运行。三个方法都打印一个字符串,只比较值从哪里来。
| |
类方法:读取类属性
| |
cls 收到 A,读取 A.method。类属性在类定义后即可访问,不需要先执行 A()。
实例方法:读取对象属性
| |
self 收到 a,读取它的实例属性。给 a.method 赋值没有修改 A.method,因此从同一对象调用类方法,结果不同:
| |
a.show_class() 的 cls 仍是 A,不会读取 a.method。
提示:本例中,未设置 a.method 时,self.method 也能读到 A.method;设置后优先读取实例属性。
静态方法:使用传入值
| |
A 和 a 只用于找到静态方法,两次实际传入的都只有 "given"。类属性也可以显式传入:
| |
与 A.show_class() 相比,这次由调用者读取 A.method 再传入。静态方法也能使用类属性,只是不自动获得当前类。
继承时,cls 与 A 的区别
B 继承 A 的方法,只修改 method 属性:
| |
用 B 调用时,cls 就是 B,读的也是 B.method。如果写死 A.method,就还是读 A 的属性,输出 class。
静态方法也能得到相同结果,但需要显式传值:
| |
B.show_static(A.method) 则输出 class:前面的 B 不会替你选择参数。
类方法把读取当前类配置的逻辑留在方法内部,调用者只需指定类。
怎么选
- 实例方法:操作已有对象的数据,如计算某个购物车的总价。
- 类方法:使用当前类的配置,或创建与调用类对应的新对象,不依赖已有实例。
- 静态方法:无需自动接收对象或类,如与类相关的格式转换;与类关系不强时,直接用普通函数。
实例方法也能使用类配置,不必因为访问了类属性就改成类方法。
评论
使用 GitHub 登录后参与讨论,评论将公开保存在 GitHub。
站长管理删除会同步到 GitHub,无法撤销。
阅读到这里时加载评论。