在 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 | 操作实例变量,可以访问类变量 |
类方法 | @classmethod | cls | 只能操作类变量,不能操作实例变量 |
静态方法 | @staticmethod | 无 self 或 cls | 既不能访问实例变量,也不能访问类变量 |
类方法的应用场景
(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
等)。
✅ 需要在继承时确保方法适配子类,而不是返回父类数据。