首页  

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

上一篇     下一篇
《战胜一切市场的人》笔记

量化策略研发全流程

均值回归策略实例

股票多因子模型实战