在 Python 里,可以把“类”想成模具,把“实例”想成用模具做出来的具体物品

比如:

1
2
3
4
5
6
7
8
9
class Cat:
species = "猫"

def eat(self):
print("这只猫正在吃饭")

@classmethod
def show_species(cls):
print(f"这是一个{cls.species}类")

实例方法

实例方法的第一个参数通常是 self

1
2
def eat(self):
...

这里的 self 代表某一个具体对象。

1
2
3
4
5
cat1 = Cat()
cat2 = Cat()

cat1.eat()
cat2.eat()

可以理解成:

“让这只具体的猫去做某件事。”

实例方法最适合操作实例自己的数据:

1
2
3
4
5
6
class Cat:
def __init__(self, name):
self.name = name

def introduce(self):
print(f"我叫{self.name}")
1
2
3
4
5
cat1 = Cat("小黑")
cat2 = Cat("小白")

cat1.introduce() # 我叫小黑
cat2.introduce() # 我叫小白

因为每只猫的名字不同,所以要通过 self 找到当前这只猫。


类方法

类方法需要加 @classmethod,第一个参数通常是 cls

1
2
3
@classmethod
def show_species(cls):
...

cls 代表的是整个类,而不是某个具体对象。

1
Cat.show_species()

可以理解成:

“让 Cat 这个模具本身去做某件事。”

类方法一般用来:

  • 操作类属性
  • 创建实例
  • 编写和整个类相关的逻辑

例如统计创建了多少只猫:

1
2
3
4
5
6
7
8
9
10
class Cat:
count = 0

def __init__(self, name):
self.name = name
Cat.count += 1

@classmethod
def show_count(cls):
print(f"一共创建了 {cls.count} 只猫")
1
2
3
4
cat1 = Cat("小黑")
cat2 = Cat("小白")

Cat.show_count() # 一共创建了 2 只猫

最通俗的区别

实例方法关心的是:

“这一只对象怎么样?”

类方法关心的是:

“这一类对象整体怎么样?”

对比 实例方法 类方法
第一个参数 self cls
代表什么 某个具体实例 类本身
装饰器 不需要 @classmethod
常见用途 操作实例属性 操作类属性、创建实例
常见调用方式 对象.方法() 类.方法()

再记一个小口诀:

self 管“这一只”,cls 管“这一类”。

顺便提醒一下:虽然类方法也能通过实例调用,比如 cat1.show_count(),但一般还是写成 Cat.show_count() 更清楚,不然代码看起来会有点“猫猫行为迷惑术”。


本站由 楠瓜 使用 Stellar 1.33.1 主题创建。
风起于青萍之末,浪成于微澜之间。