python @classmethod 和 @staticmethod 区别
所属分类 python
浏览量 9
@classmethod(类方法)和@staticmethod(静态方法)
是 Python 中两种修饰类中方法的装饰器,
核心区别在于是否绑定类 / 实例、参数传递、使用场景
类方法绑类(cls),静态方法无绑定,实例方法绑实例(self)
选择/核心判断依据
@classmethod 需要访问类属性、适配继承、创建实例
@staticmethod 纯工具函数、无类 / 实例依赖、仅参数计算
普通实例方法 需要访问实例属性(self)
@classmethod
绑定到类(而非实例)
第一个参数 必须是cls(代表类本身)
可通过cls访问类属性,无法直接访问实例属性
继承行为 子类调用时,cls自动指向子类
调用方式 类调用(推荐)/ 实例调用
class Person:
# 类属性
species = "人类"
def __init__(self, name, age):
# 实例属性
self.name = name
self.age = age
# 类方法:第一个参数是cls(代表Person类)
@classmethod
def get_species(cls):
# cls 可直接访问类属性
return f"物种:{cls.species}"
# 类方法:也可用于创建实例(工厂方法)
@classmethod
def create_adult(cls, name):
# cls 指向类,可直接创建实例(子类调用时自动创建子类实例)
return cls(name, 18)
# 静态方法:无强制参数,仅做工具函数
@staticmethod
def is_adult(age):
# 无法直接访问 cls.species 或 self.name,需手动传参
return age >= 18
# 普通实例方法(对比参考)
def introduce(self):
return f"我是{self.name},今年{self.age}岁"
# ---------------------- 调用测试 ----------------------
# 1. 类方法调用(推荐:类直接调用)
print(Person.get_species()) # 输出:物种:人类
adult = Person.create_adult("张三")
print(adult.introduce()) # 输出:我是张三,今年18岁
# 2. 静态方法调用(推荐:类直接调用)
print(Person.is_adult(20)) # 输出:True
print(Person.is_adult(17)) # 输出:False
# 3. 实例调用(不推荐,但语法允许)
p = Person("李四", 25)
print(p.get_species()) # 输出:物种:人类(cls仍指向Person类)
print(p.is_adult(p.age)) # 输出:True
class Student(Person):
species = "学生(人类)"
# 子类重写类方法(可选)
@classmethod
def get_species(cls):
return f"子类物种:{cls.species}"
# ---------------------- 继承测试 ----------------------
# 类方法:cls 自动指向子类 Student
print(Student.get_species()) # 输出:子类物种:学生(人类)
student_adult = Student.create_adult("王五")
print(student_adult.__class__) # 输出:(创建的是子类实例)
# 静态方法:仍执行父类 Person 的逻辑,无适配
print(Student.is_adult(18)) # 输出:True(和父类结果一致,未关联子类)
使用场景
1. @classmethod 适用场景
工厂方法:创建实例的便捷方式(如根据不同参数生成实例);
操作类属性:需要读取 / 修改类属性时(无需实例化);
继承适配:希望方法随子类自动调整逻辑时;
替代构造方法:补充__init__的功能(如create_adult无需传 age)
示例:工厂方法创建不同类型的实例
class Book:
def __init__(self, title, author, type_):
self.title = title
self.author = author
self.type_ = type_
@classmethod
def create_novel(cls, title, author):
# 固定 type_ 为小说,简化实例创建
return cls(title, author, "小说")
@classmethod
def create_textbook(cls, title, author):
return cls(title, author, "教材")
# 便捷创建不同类型的书籍
novel = Book.create_novel("三体", "刘慈欣")
textbook = Book.create_textbook("Python编程", "张三")
print(novel.type_) # 输出:小说
print(textbook.type_) # 输出:教材
2. @staticmethod 适用场景
工具函数:逻辑独立,不依赖类属性 / 实例属性,仅做纯逻辑计算;
代码归类:将和类相关但无绑定关系的函数放在类内部(提升代码可读性);
无状态逻辑:无需访问类 / 实例的任何数据,仅接收参数处理。
class MathUtils:
@staticmethod
def add(a, b):
return a + b
@staticmethod
def is_even(num):
return num % 2 == 0
# 无需实例化,直接调用工具函数
print(MathUtils.add(3, 5)) # 输出:8
print(MathUtils.is_even(6)) # 输出:True
class Test:
num = 10
@staticmethod
def get_num():
# 静态方法无法直接用cls,若要访问类属性需手动传类
# 手动传类名,而非 cls
return Test.num
上一篇
下一篇
《战胜一切市场的人》笔记
量化策略研发全流程
均值回归策略实例
股票多因子模型实战