当前位置: 首页 > news >正文

@classmethod

1. 基本概念

@classmethod 是 Python 中用于定义类方法的一种装饰器。类方法与常规的实例方法不同,它的第一个参数是 cls,表示类本身,而不是实例。

class MyClass:class_attr = "Class Attribute"@classmethoddef class_method(cls):print(f"Accessing {cls.class_attr} via class method.")# 调用类方法(无需实例化)
MyClass.class_method()  # 输出: Accessing Class Attribute via class method.

2. classmethod vs staticmethod vs 实例方法

classmethod vs staticmethod vs 实例方法

3. classmethod 的优点

3.1 封装构造逻辑

将展开成对象的逻辑隔离在 class 内部,外部不需知道细节:

class Person:def __init__(self, name, age):self.name = nameself.age = age@classmethoddef from_string(cls, data_str):name, age = data_str.split(',')return cls(name, int(age))p = Person.from_string("Alice,30")
print(p.name, p.age)  # 输出: Alice 30

3.2 类状态管理

修改类属性或跨实例共享状态。

class MyClass:class_var = 0@classmethoddef my_class_method(cls, value):cls.class_var += value# 实例化前调用类方法
MyClass.my_class_method(10)a = MyClass()
b = MyClass()print(a.class_var)  # 10
print(b.class_var)  # 10# 修改类属性
MyClass.my_class_method(5)print(a.class_var)  # 15
print(b.class_var)  # 15# 给 a 实例设置同名属性
a.class_var = 100print(a.class_var)  # 100  -> 实例属性覆盖类属性
print(b.class_var)  # 15   -> 还是引用类属性
print(MyClass.class_var)  # 15

class_var 是类属性,属于类。
如果实例中没有 class_var,访问 obj.class_var 会去类中找。
一旦你给实例赋了 obj.class_var = 100,这个属性就变成了实例属性,不再和类属性同步。

3.3 易于维护

如果构造函数变了参数,只需修改 classmethod,外部使用不用改。

3.4 多样化构造方法

@classmethod
def from_dict(cls, d): ...@classmethod
def from_json(cls, j): ...

4. 子类是否需要重写 classmethod

需要:子类构造参数与父类不同、子类逻辑与父类不同
可以不写:父类方法已符合

5. classmethod + 多态封装

通过 @classmethod 实现多态,不同子类可自定义类方法行为。
父类定义类方法接口,子类重写实现多态。
调用时通过 cls 动态绑定到子类,避免硬编码类名。

class Animal:@classmethoddef make_sound(cls):raise NotImplementedError("Subclasses must implement this!")class Dog(Animal):@classmethoddef make_sound(cls):return "Woof!"class Cat(Animal):@classmethoddef make_sound(cls):return "Meow!"def animal_sound(animal_cls):print(animal_cls.make_sound())animal_sound(Dog)  # 输出: Woof!
animal_sound(Cat)  # 输出: Meow!
http://www.dtcms.com/a/283046.html

相关文章:

  • 无细胞蛋白表达|线性DNA快速表达|高效体外合成系统
  • LintCode第104题-合并k个排序链表
  • Eplan API Project Settings
  • 08_驱动编写(ko文件生成与使用)
  • Linux中CentOS-7-x86_64:安装JDK1.8与启动部署Tomcat8.5.45(适合开发/测试环境)
  • ASP.NET Core Hosting Bundle
  • 关于liblvgl.so文件其实已经存在于当前目录下(可以看到ls命令列出了该文件),但程序仍然找不到它的原因及其解决方法:
  • 多商户二手车小程序系统源码,多端适配,带完整的搭建部署教程
  • C# 按照主题的订阅 按照类型的订阅
  • 人工智能与机器人研究|深孔内表面缺陷特征内窥测量方法研究
  • 智能呼叫中心系统:重构客户服务的核心引擎
  • 浅谈车载电控和机器人一体化关节电控区别和联系
  • 【Arm】Fusa Compiler 6.16LTS的安全认证报告获取
  • Openharmony XTS编译运行
  • 2025年Java最新社招面试八股文+技术场景题(金九银十)
  • Linux内核设计与实现 - 第2章 内核开发的准备
  • git的diff命令、Config和.gitignore文件
  • 《机器学习数学基础》补充资料:标准差与标准化
  • Ceph集群OSD崩溃恢复
  • 量子比特耦合与系统集成:量子计算硬件的核心突破
  • 离线部署三节点 Ceph 分布式存储
  • 访问者设计模式
  • Elasticsearch+Logstash+Kibana部署
  • java解析word文档
  • windows内核研究(进程与线程-等待链表和调度链表和线程切换)
  • Excel 导入导出工具类文档
  • ubuntu中拷贝docker容器中的文件到宿主机
  • 万字长文解析 OneCode3.0 AI创新设计
  • 微服务的编程测评系统2
  • 2025年量化交易平台对比:付费与开源方案深度分析