跳至内容

Python 类方法与静态方法

Python 实例方法、类方法和静态方法的区别、调用方式与使用场景。

  • Python 3
  • 面向对象
  • 方法绑定

@classmethod 定义类方法,自动接收当前类 cls。

@staticmethod 定义静态方法,不自动接收类或对象。

实例方法通过对象调用时,自动接收该对象 self。

差异一览

方法自动接收适合的需求
实例方法从对象调用时,接收该对象 self处理这个对象的数据
类方法接收当前调用的类 cls使用当前类的属性或行为
静态方法不自动接收对象或类处理明确给出的参数

self、cls 是惯用参数名,不是关键字。自动传参规则见官方的方法对照。

同一个类,三种写法

以下示例基于 Python 3.13,按顺序运行。三个方法都打印一个字符串,只比较值从哪里来。

代码块 Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class A:
    method = "class"

    def show_instance(self):
        print(self.method)

    @classmethod
    def show_class(cls):
        print(cls.method)

    @staticmethod
    def show_static(method):
        print(method)

类方法:读取类属性

代码块 Python
1
2
3
A.show_class()
# 输出:
# class

cls 收到 A,读取 A.method。类属性在类定义后即可访问,不需要先执行 A()。

实例方法:读取对象属性

代码块 Python
1
2
3
4
5
6
a = A()
a.method = "instance"

a.show_instance()
# 输出:
# instance

self 收到 a,读取它的实例属性。给 a.method 赋值没有修改 A.method,因此从同一对象调用类方法,结果不同:

代码块 Python
1
2
3
a.show_class()
# 输出:
# class

a.show_class() 的 cls 仍是 A,不会读取 a.method。

提示:本例中,未设置 a.method 时,self.method 也能读到 A.method;设置后优先读取实例属性。

静态方法:使用传入值

代码块 Python
1
2
3
4
5
6
7
A.show_static("given")
# 输出:
# given

a.show_static("given")
# 输出:
# given

A 和 a 只用于找到静态方法,两次实际传入的都只有 "given"。类属性也可以显式传入:

代码块 Python
1
2
3
A.show_static(A.method)
# 输出:
# class

与 A.show_class() 相比,这次由调用者读取 A.method 再传入。静态方法也能使用类属性,只是不自动获得当前类。

继承时,cls 与 A 的区别

B 继承 A 的方法,只修改 method 属性:

代码块 Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class B(A):
    method = "subclass"


A.show_class()
# 输出:
# class

B.show_class()
# 输出:
# subclass

用 B 调用时,cls 就是 B,读的也是 B.method。如果写死 A.method,就还是读 A 的属性,输出 class。

静态方法也能得到相同结果,但需要显式传值:

代码块 Python
1
2
3
B.show_static(B.method)
# 输出:
# subclass

B.show_static(A.method) 则输出 class:前面的 B 不会替你选择参数。

类方法把读取当前类配置的逻辑留在方法内部,调用者只需指定类。

怎么选

  • 实例方法:操作已有对象的数据,如计算某个购物车的总价。
  • 类方法:使用当前类的配置,或创建与调用类对应的新对象,不依赖已有实例。
  • 静态方法:无需自动接收对象或类,如与类相关的格式转换;与类关系不强时,直接用普通函数。

实例方法也能使用类配置,不必因为访问了类属性就改成类方法。

评论

使用 GitHub 登录后参与讨论,评论将公开保存在 GitHub。

阅读到这里时加载评论。