在 Python 中,类方法 (@classmethod) 和静态方法 (@staticmethod) 是类作用域下的两种特殊方法。它们使用装饰器定义,并且与实例方法 (def func(self)) 的行为有所不同。


1. 三种方法的对比概览

方法类型是否访问实例 (self)是否访问类 (cls)典型用途
实例方法✅ 是❌ 否访问对象属性
类方法 @classmethod❌ 否✅ 是创建类的替代构造器,访问类变量等
静态方法 @staticmethod❌ 否❌ 否工具函数,与类逻辑相关但不依赖类或实例

2. 实例方法(默认方法)

class MyClass:def instance_method(self):print(f"This is an instance method. self = {self}")obj = MyClass()
obj.instance_method()  #  输出 self 为该实例

3. 类方法 @classmethod

class MyClass:class_var = "Hello, Class!"@classmethoddef class_method(cls):print(f"This is a class method. cls = {cls}")print(f"Access class_var = {cls.class_var}")MyClass.class_method()  #  通过类调用
obj = MyClass()
obj.class_method()      #  通过实例也可以调用

🔹 特点:

  • 第一个参数是 cls,代表类本身

  • 常用于:

    • 构造不同初始化方式
    • 修改/访问类变量
    • 工厂模式 (from_* 等)

示例:类方法作为工厂方法

class Book:def __init__(self, title, author):self.title = titleself.author = author@classmethoddef from_string(cls, book_str):title, author = book_str.split(",")return cls(title.strip(), author.strip())book = Book.from_string("1984, George Orwell")
print(book.title)  # ➜ 1984

4. 静态方法 @staticmethod

class MyMath:@staticmethoddef add(x, y):return x + yprint(MyMath.add(3, 5))  # ➜ 8

特点:

  • 不接收 selfcls 参数

  • 和普通函数类似,但归属在类中,逻辑上与类相关

  • 常用于:

    • 与类操作相关的工具方法
    • 不需要访问类或实例内部状态

示例:静态方法作为工具函数

class Temperature:def __init__(self, celsius):self.celsius = celsius@staticmethoddef to_fahrenheit(c):return c * 9 / 5 + 32def show(self):print(f"{self.celsius}°C = {self.to_fahrenheit(self.celsius)}°F")temp = Temperature(25)
temp.show()  # ➜ 25°C = 77.0°F

总结:何时用哪种方法?

场景推荐方法
需要访问或修改实例属性实例方法
需要访问或修改类变量、类构造类方法 @classmethod
工具函数:与类相关但不访问类或实例成员静态方法 @staticmethod

@classmethod@staticmethod 应用场景实战

利用 Python 中的 @classmethod@staticmethod 可以优雅地实现设计模式,如单例模式工厂模式。下面我将分别讲解这两种模式的原理、适用场景,并结合代码示例说明如何使用类方法或静态方法实现。


1、工厂模式(Factory Pattern)

定义:工厂模式是一种创建对象的设计模式,它允许类在创建对象时不暴露实例化逻辑,而是通过类方法返回不同的类实例。

使用类方法实现工厂模式

class Animal:def __init__(self, name):self.name = name@classmethoddef create_dog(cls):return cls("Dog")@classmethoddef create_cat(cls):return cls("Cat")# 使用工厂方法创建对象
dog = Animal.create_dog()
cat = Animal.create_cat()print(dog.name)  # ➜ Dog
print(cat.name)  # ➜ Cat

应用场景

  • 多种初始化方式(如从字符串、文件、数据库等)
  • 根据条件返回不同子类对象

更复杂示例:带注册机制的工厂

class ShapeFactory:_creators = {}@classmethoddef register(cls, name, creator):cls._creators[name] = creator@classmethoddef create(cls, name, *args, **kwargs):if name not in cls._creators:raise ValueError(f"Unknown shape: {name}")return cls._creators[name](*args, **kwargs)# 各种 Shape 类
class Circle:def __init__(self, radius):self.radius = radiusclass Square:def __init__(self, length):self.length = length# 注册
ShapeFactory.register("circle", Circle)
ShapeFactory.register("square", Square)# 创建对象
c = ShapeFactory.create("circle", 5)
s = ShapeFactory.create("square", 3)
print(c.radius)  # ➜ 5
print(s.length)  # ➜ 3

2、单例模式(Singleton Pattern)

定义:单例模式保证类在程序中只有一个实例。

使用类方法实现单例

class Singleton:_instance = None@classmethoddef get_instance(cls):if cls._instance is None:cls._instance = cls()return cls._instance# 测试
a = Singleton.get_instance()
b = Singleton.get_instance()
print(a is b)  # ➜ True

也可以结合 __new__ 实现单例

class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if not cls._instance:cls._instance = super().__new__(cls)return cls._instance# 所有实例是同一个
a = Singleton()
b = Singleton()
print(a is b)  # ➜ True

3、静态方法在设计模式中的作用

工具类模式(Utility Pattern)

静态方法常用于实现工具类(即所有方法都与对象状态无关,仅执行逻辑计算)。

class MathUtils:@staticmethoddef add(x, y):return x + y@staticmethoddef multiply(x, y):return x * yprint(MathUtils.add(3, 4))       # ➜ 7
print(MathUtils.multiply(3, 4))  # ➜ 12

4、小结

设计模式推荐使用原因
工厂模式@classmethod需要访问类构造器、支持多种创建方式
单例模式@classmethod / __new__控制实例生成的唯一性
工具类@staticmethod无需访问类/实例,仅提供辅助功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914171.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914171.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914171.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FastGPT革命:下一代语言模型的极速进化

本文深度解析FastGPT核心技术架构,涵盖分布式推理、量化压缩、硬件加速等前沿方案,包含完整落地实践指南,助你掌握大模型高效部署的终极武器。引言:当大模型遭遇速度瓶颈2023年,ChatGPT引爆全球AI热潮,但企…

Geant4 安装---Ubuntu

安装工具 C/C工具包 sudo apt install build-essentialCmake sudo apt install -y cmakeccmake sudo apt install -y cmake-curses-gui安装Qt可视化工具(不需要可视化可以不安装) sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator 安装Ope…

Spring Boot中请求参数读取方式

目录 一、前言 二、六种参数读取方式 1.RequestParam 2.PathVariable 3.RequestBody 4.RequestHeader 5.CookieValue 6.MatrixVariable 三、对比和搭配 1.适用方法类型及建议使用场景 2.建议使用的请求路径注解 3. 多种参数同时使用 4.同一请求不同方案&#xff1f…

2025华为OD机试真题最新题库 (B+C+D+E+2025A+2025B卷) + 在线OJ在线刷题使用(C++、Java、Python C语言 JS合集)(正在更新2025B卷,目前已收录710道)

2025年,已经开始使用AB卷题库,题目和往期一样,旧题加新题的组合,有题目第一时间更新,大家可以跟着继续学习,目前使用复用题较多,可在OJ上直接找到对应的AB卷学习,可以放心学习&#…

分析新旧因子相关性

计算一组新因子、并分析它们与已有因子间的相关性1. 导入库和初始化环境功能代码解析数据加载2. 定义新因子计算函数功能代码解析因子 1:波动率过滤器(filter_001_1)因子 2:ATR 过滤器(filter_001_2)因子 3…

Unity Demo——3D平台跳跃游戏笔记

今天是一个3D平台跳跃游戏的笔记。我们按照以下分类来对这个项目的代码进行学习:核心游戏系统 (Core Game Systems)核心游戏系统是IkunOdyssey项目的基础,负责所有游戏对象(如玩家、敌人、道具等)的通用行为和物理交互。它通过实体…

【C语言】回调函数、转移表、qsort 使用与基于qsort改造冒泡排序

文章目录数组指针/指针数组函数指针函数指针数组函数指针数组用途(转移表)回调函数qsort函数基于qsort改造冒泡排序源码数组指针/指针数组 int arr1[5] { 1,2,3,4,5 };int (*p1)[5] &arr1; //p1是数组指针变量int* arr2[5] { 0 }; //arr2是指针数组指针数组是存放指…

vue3 uniapp 使用ref更新值后子组件没有更新 ref reactive的区别?使用from from -item执行表单验证一直提示没有值

遇到这样一个问题,我有个1个页面A,一个from表单组件,一个form-item组件, 使用是这样的,我在父组件A中使用 ,执行表单验证一直提示没有值咱们先来讲一讲ref 和reactive的区别 ref 用来创建一个基本类型或单…

PyQt5布局管理(QBoxLayout(框布局))

QBoxLayout(框布局) 采用QBoxLayout类可以在水平和垂直方向上排列控件,QHBoxLayout和 QVBoxLayout类继承自QBoxLayout类。 QHBoxLayout(水平布局) 采用QHBoxLayout类,按照从左到右的顺序来添加控件。QHBoxL…

Grok 4作战图刷爆全网,80%华人横扫硅谷!清华上交校友领衔,95后站C位

来源 | 新智元短短两年,马斯克Grok 4的横空出世,让xAI团队一举站上AI之巅。昨日一小时发布会,Grok 4让所有人大开眼界,直接刷爆了AIME 2025、人类最后的考试(HLE)两大基准。这是狂堆20万GPU才换来的惊人成果…

AI大模型(七)Langchain核心模块与实战(二)

Langchain核心模块与实战(二)Langchian向量数据库检索Langchian构建向量数据库和检索器批量搜索返回与之相似度最高的第一个检索器和模型结合得到非笼统的答案LangChain构建代理通过代理去调用Langchain构建RAG的对话应用包含历史记录的对话生成Langchia…

Flutter基础(前端教程①-容器和控件位置)

一个红色背景的 Container垂直排列的 Column 布局中央的 ElevatedButton按钮下方的白色文本import package:flutter/material.dart;void main() {runApp(const MyApp()); }class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);overrideWidget bu…

CSS flex

目录 flex-box和flex-item 主轴和副轴 ​编辑 flex-box的属性 flex-direction flex-wrap flex-flow justify-content ​编辑​align-items align-content flex-item的属性 flex-basis flex-grow flex-shrink flex flex-box和flex-item 当把一个块级元素的displ…

【JMeter】执行系统命令

步骤如下: 添加JSP233 Sampler:右击线程组>添加>取样器>JSR223 Sampler2.填写脚本,执行后查看日志。res "ipconfig".execute().text log.info(res)res "python -c \"print(11)\"".execute().text l…

AI Agent开发学习系列 - langchain之memory(1):内存中的短时记忆

内存中的短时记忆,在 LangChain 中通常指 ConversationBufferMemory 这类“对话缓冲记忆”工具。它的作用是:在内存中保存最近的对话历史,让大模型能理解上下文,实现连续对话。 对话缓冲记忆”工具 主要特点 只保留最近的对话内容…

uniapp实现微信小程序端图片保存到相册

效果图展示 安装插件海报画板导入到项目里面&#xff0c;在页面直接使用 <template><view><button click"saveToAlbum" class"save-button">保存到相册</button><image :src"path" mode"widthFix" v-if&qu…

Java生产带文字、带边框的二维码

Java 生成带文字、带边框的二维码1、Java 生成带文字的二维码1.1、导入jar包1.2、普通单一的二维码1.2.1、代码示例1.2.2、效果1.3、带文字的二维码1.&#xff13;.&#xff11;、代码示例1.3.2、效果2、带边框的二维码2.1、代码示例2.2、带边框的二维码效果 1、Java 生成带文字…

ARM单片机启动流程(三)(栈空间综合理解及相关实际应用)

文章目录1、引出栈空间问题2、解决问题2.1、RAM空间2.2、RAM空间具体分布2.3、关于栈空间的使用2.4、栈溢出2.5、变量的消亡2.6、回到关键字static2.7、合法性的判断1、引出栈空间问题 从static关键字引出该部分内容。 为什么能从static引出来&#xff1f; 在使用该关键字的…

【RK3568+PG2L50H开发板实验例程】FPGA部分 | 键控LED实验

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 1.实验简介 实验目的&#xff1a; 从创建工程到编写代码&#xff0c;完成引脚约束&#xff0c;最后生成 bit 流下载到…

【Python练习】039. 编写一个函数,反转一个单链表

039. 编写一个函数,反转一个单链表 039. 编写一个函数,反转一个单链表方法 1:迭代实现运行结果代码解释方法 2:递归实现运行结果代码解释选择方法迭代法与递归法的区别039. 编写一个函数,反转一个单链表 在 Python 中,可以通过迭代或递归的方式反转一个单链表。 方法 1…