Python 的内置函数 classmethod

作者:IMPYLH日期:2025/10/23

Python 内建函数列表 > Python 的内置函数 classmethod

Python 的内置函数 classmethod 是一个装饰器,用于将一个方法标记为类方法。类方法属于类本身,而不是类的实例,因此可以在不创建实例的情况下直接通过类名调用。

1def classmethod(fn):
2    '''
3    把一个方法封装成类方法
4
5    :param fn: 要封装的方法
6    :return: 封装后的方法
7    '''
8

使用 @classmethod 装饰器来定义类方法:

1class MyClass:
2    @classmethod
3    def my_class_method(cls, arg1, arg2):
4        # 方法实现
5        pass
6

示例:

运行结果

1class Employee:
2    raise_amount = 1.04  # 类变量
3
4    def __init__(self, name, salary):
5        self.name = name
6        self.salary = salary
7
8    @classmethod
9    def set_raise_amount(cls, amount):
10        cls.raise_amount = amount  # 修改类变量
11
12# 使用
13Employee.set_raise_amount(1.05)  # 直接通过类调用
14emp = Employee("John", 50000)
15emp.set_raise_amount(1.06)  # 也可以通过实例调用(但修改的是类变量)
16

类方法是面向对象编程中一种特殊的方法类型,它属于类本身而非类的实例对象。与普通实例方法不同,类方法在定义时需要使用@classmethod装饰器进行修饰,并且其第一个参数约定俗成命名为cls(指代类本身),而不是实例方法的self参数。

类方法的主要特点包括:

  1. 访问方式:可以直接通过类名调用(如ClassName.method_name()),无需创建类的实例
  2. 应用场景:适合处理与类相关但不依赖于特定实例的操作
  3. 参数特点:自动接收类对象作为第一个参数
  4. 权限范围:可以访问类属性,但不能直接访问实例属性

常见的使用场景包括:

  1. 工厂模式:创建类的替代构造方法
    • 当需要根据不同的输入参数创建不同类型的对象实例时,可以使用类方法作为工厂方法
    • 例如:一个图形类可以有类方法 create_circle()create_square() 来创建特定类型的图形对象
    • 比直接使用构造函数更灵活,可以封装复杂的对象创建逻辑
  2. 类状态的修改:修改所有实例共享的类变量
    • 当需要修改或访问类的全局状态时,可以使用类方法
    • 例如:一个计数器类可以用类方法 increment_count() 来修改所有实例共享的计数变量
    • 适用于需要在整个类范围内维护和操作共享数据的情况
  3. 工具方法:提供与类相关但不依赖实例的实用功能
    • 当需要提供与类相关但不需要实例化的功能时,可以使用类方法
    • 例如:数学计算类可以提供 convert_units() 这样的单位转换方法
    • 日期处理类可以提供 is_leap_year() 这样的静态检查方法
    • 这些方法逻辑上与类相关,但不依赖于具体的实例状态

其他应用场景还包括:

  • 替代构造函数(如从不同数据格式创建对象)
  • 实现单例模式
  • 提供类级别的配置方法
  • 执行类相关的预处理或后处理操作

示例:

1class Date:
2    def __init__(self, year, month, day):
3        self.year = year
4        self.month = month
5        self.day = day
6    
7    @classmethod
8    def from_string(cls, date_string):
9        year, month, day = map(int, date_string.split('-'))
10        return cls(year, month, day)  # 相当于调用Date(year, month, day)
11
12# 直接通过类调用而不需实例化
13date = Date.from_string("2023-05-15")
14

与静态方法的区别:
虽然静态方法(@staticmethod)也可以通过类名直接调用,但它不会自动接收类或实例作为参数(self或cls),更适合完全独立于类和实例的操作。与实例方法必须接收self参数和类方法必须接收cls参数不同,静态方法就像一个被封装在类里的普通函数,既可被类调用,也可被实例调用。

这种特性使静态方法特别适合以下场景:

  1. 类中需要实现但不需要访问类或实例状态的辅助功能
  2. 将相关功能组织在同一个命名空间下
  3. 不需要继承重写的工具方法

例如

1class MathUtility:
2    @staticmethod
3    def add(a, b):
4        return a + b
5    
6    @staticmethod
7    def factorial(n):
8        return 1 if n == 0 else n * MathUtility.factorial(n-1)
9
10# 通过类名调用
11print(MathUtility.add(2, 3))  # 输出5
12print(MathUtility.factorial(5))  # 输出120
13
14# 通过实例调用
15calc = MathUtility()
16print(calc.add(5, 7))  # 输出12
17

需要注意的是,静态方法虽然方便,但过度使用会影响代码的面向对象特性。静态方法本质上属于函数式编程范式,它们以独立的方式存在,无法访问类或实例的状态(self或cls)。这种特性使得静态方法更适合处理与类相关但不需要类状态的操作,比如数学计算、工具函数等。

以下是一些典型场景的对比:

  1. 适合使用静态方法的例子:
  • 计算两个日期之间的天数差
  • 验证字符串格式是否符合规范
  • 生成随机ID等工具函数
  1. 应该使用实例方法的例子:
  • 需要访问或修改实例属性的操作
  • 涉及业务逻辑的状态变更
  • 需要多态特性的方法

当方法确实需要访问类或实例状态时,仍应使用实例方法或类方法。比如:

  • 需要访问实例属性的方法应定义为实例方法
  • 需要访问类级别的配置或状态时应使用类方法
  • 需要同时操作实例和类状态时要使用混合方法

过度使用静态方法会导致代码失去面向对象的优势,如继承、多态和封装等特性。合理的做法是根据实际业务需求,在保持代码面向对象特性的前提下适当使用静态方法。


Python 的内置函数 classmethod》 是转载文章,点击查看原文


相关推荐


攻防世界—easyupload
风语者日志2025/10/22

知识点补充 .user.ini php.ini是php的一个全局配置文件,对整个web服务起作用;而.user.ini和.htaccess一样是目录的配置文件,.user.ini就是用户自定义的一个php.ini,我们可以利用这个文件来构造后门和隐藏后门。 常用配置 auto_prepend_file = <filename> //包含在文件头 auto_append_file = <filename> //包含在文件尾 一句话木马变种 这里的题目由


数据结构(顺序表和链表)
泡泡鱼(敲代码中)2025/10/21

数据结构(题) 一、顺序表 1、移除元素   int removeElement(int* nums, int numsSize, int val) {     int dst = 0;     int src = 0;     while(src<numsSize)     {         if(nums[src]!=val)         {             nums[dst]=nums[src];             dst++;     


运放的 Input Offset Drift(输入失调漂移)
Heismk2025/10/19

Input Offset Drift(输入失调漂移)是衡量运算放大器(或其他精密放大器件)性能的关键指标,用于描述温度变化时输入失调电压的变化率,直接反映器件在温度波动环境下的稳定性。 核心定义 输入失调漂移指的是:当环境温度每变化 1℃ 时,运放的**输入失调电压(Input Offset Voltage)**所发生的变化量,单位通常为 μV/℃(微伏每摄氏度)或 nV/℃(纳伏每摄氏度)。 输入失调电压(Vos):理想运放输入短路时输出应为 0,但实际器件因内部工艺差异,需在输入端施加一个微


Compose 自定义布局和图形
Best_Jerry2025/10/18

Advanced layout concepts - MAD Skills Compose 提供各种开箱即用型解决方案,可帮助您快速轻松地从头开始构建界面。但是,如果您需要更进一步,以实现完全自定义的界面,该怎么办?详细了解高级布局概念,以便自行构建自定义布局,让您的设计实现更上一层楼。 1. Advanced Layout Concepts Layout 这一术语在 Compose 中有多种含义: 以下是每种含义的相关解释: 2. Layout phase and constraint


告别加班!这些数组操作技巧让前端开发效率翻倍
良山有风来2025/10/17

你是不是经常遇到这样的场景:产品经理扔过来一堆数据,要你快速处理展示;后端返回的数组结构复杂,需要层层筛选过滤;明明很简单的数据操作,却要写一大堆循环和判断... 别担心!今天这篇干货,就是来拯救你的。我将带你系统掌握JavaScript数组和对象的核心操作,学完立刻就能用在实际项目中。相信我,掌握这些技巧后,你的开发效率至少提升一倍! 数组基础:从创建到遍历 让我们从最基础的数组操作开始。数组就像是一个数据容器,能帮我们有序地存放各种信息。 创建数组有两种常用方式。第一种是用方括号,这是最简洁


阿里云负载均衡SLB的使用参考:创建阿里云ECS实例操作
熙客2025/10/15

目录 一、背景知识 1.1 概念 1.2 负载均衡类型选择 1.3 核心功能与工作原理 1.4 配置负载均衡的注意事项 二、传统型负载均衡CLB的使用示例 2.1 创建3个ECS实例 2.2 安装nginx 2.3 创建负载均衡CLB 2.4 负载均衡配置 2.5 负载均衡检验 一、背景知识 1.1 概念 阿里云负载均衡能将访问流量分发到后端多台云服务器上,提升应用系统的服务能力和高可用性。它主要包含以下三种产品: 特性维度CLB(传统型负载均衡)ALB(应


NineData云原生智能数据管理平台新功能发布|2025年9月版
NineData2025/10/14

本月共发布 17 项更新,其中重点发布 6 项、功能优化 11 项。 重点发布 数据库 DevOps - SQL 任务事务执行 SQL 任务支持以事务方式执行。在 DML 语句执行失败后自动回滚整个任务,确保执行原子性与一致性。 数据库 DevOps - 数据脱敏与敏感扫描 敏感数据保护模块新增支持 PostgreSQL、SQL Server、Oracle 数据源的自动扫描与脱敏,帮助企业更全面地识别并防护敏感信息。 数据库 DevOps - ER 图增强 ER 图现


Flutter - Melos Pub workspaces 实践
LinXunFeng2025/10/13

欢迎关注微信公众号:FSA全栈行动 👋 一、前言 为解决 App 代码臃肿、编译耗时的问题,我们进行了分包重构,核心思路如下: 业务分包:将不同业务线的代码拆分成独立的包,开发者只需聚焦于各自包内的 example 工程进行开发,从而提升编译和运行效率。 功能沉淀:把跨业务复用的功能(包括基础业务和非业务功能)也抽离成独立的包,逐步让主 App 轻量化为一个“空壳”,负责集成所有模块。 依赖管理:业务包之间使用 git 依赖,指向 master 分支;而非业务的功能包则发布到自建的 unp


业务流程建模标准(BPMN)
deepdata_cn2025/10/11

在数字化转型浪潮中,企业对业务流程的可视化、标准化与自动化需求日益迫切。BPMN(Business Process Model and Notation,业务流程建模符号) 作为全球通用的业务流程建模标准,通过统一的图形语言打破了“业务人员说不清楚、IT人员看不懂”的沟通壁垒,成为连接业务需求与技术实现的核心桥梁。 一、BPMN的起源与发展 在BPMN出现前,企业建模缺乏统一规范:有的用流程图(Flowchart),有的用UML活动图,甚至有的用手绘草图——不同角色对同一流程的理解差异巨大,导致


JDK8 新特性 - Stream 流详解
chirrupy_hamal2025/10/9

文章目录 一、认识 Stream二、Stream 的常用方法1、如何获取 Stream 流2、Stream 流常见的中间方法2.3、Stream 流常见的终结方法 一、认识 Stream 二、Stream 的常用方法 1、如何获取 Stream 流 2、Stream 流常见的中间方法 代码简化 s -> s.getName() Studet::getName 代码简化 2.3、Stream 流常见的终结方法 报错

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0