Skip to main content

在 Python 中,**类方法(Class Method)**是一种特殊的方法,它是绑定在类上而不是实例上的。类方法通常用来操作类本身的数据,而不是单个实例的数据。它可以访问和修改 类变量,而不是实例变量。类方法使用 @classmethod装饰器,并接收 cls 作为第一个参数,表示当前类。

类方法的特点:

  • @classmethod 装饰器定义。
  • 至少接受一个参数,约定俗成命名为 cls,表示类本身。
  • 通过类对象或实例都可以调用。
  • 常用于创建工厂方法、修改类级变量、实现类级逻辑。

类方法的简单例子:

class Animal:
species = "Unknown" # 类变量(所有实例共享)

def __init__(self, name):
self.name = name # 实例变量(每个实例独立)

@classmethod
def set_species(cls, species_name):
cls.species = species_name # 修改类变量

@classmethod
def get_species(cls):
return cls.species

# 调用类方法(不需要实例化对象)
print(Animal.get_species()) # 输出: Unknown

# 修改类变量
Animal.set_species("Mammal")
print(Animal.get_species()) # 输出: Mammal

# 创建实例,类变量的修改对所有实例生效
dog = Animal("Buddy")
print(dog.get_species()) # 输出: Mammal

类方法 vs 实例方法 vs 静态方法

方法类型装饰器第一个参数作用
实例方法无装饰器self操作实例变量,可以访问类变量
类方法@classmethodcls只能操作类变量,不能操作实例变量
静态方法@staticmethodselfcls既不能访问实例变量,也不能访问类变量

类方法的应用场景

(1)作为工厂方法创建实例

类方法可以用于提供 多个构造器,如从不同格式的数据创建实例:

class Person:
def __init__(self, name, age):
self.name = name
self.age = age

@classmethod
def from_string(cls, data_string):
name, age = data_string.split("-")
return cls(name, int(age))

# 通过工厂方法创建实例
p1 = Person("Alice", 25)
p2 = Person.from_string("Bob-30")

print(p1.name, p1.age) # 输出: Alice 25
print(p2.name, p2.age) # 输出: Bob 30

(2)继承时,自动适配子类

如果子类调用类方法,它会自动作用于 当前子类,而不是父类:

class Parent:
name = "Parent"

@classmethod
def show_name(cls):
return cls.name # cls 指向当前类

class Child(Parent):
name = "Child"

print(Parent.show_name()) # 输出: Parent
print(Child.show_name()) # 输出: Child (自动适配)

什么时候用类方法?🚀

✅ 需要修改或访问类变量,而不是实例变量

✅ 需要定义 额外的构造方法 (如 from_string 等)。

✅ 需要在继承时确保方法适配子类,而不是返回父类数据。