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

python中 ​实例方法​(普通方法)和 ​类方法​ 的核心差异

一、普通实例方法(没加 @classmethod的情况)

假设你的代码原本是这样(普通实例方法):

class Jglc_Test_api:def login(self, session, login_data):  # 第一个参数是 self# 登录逻辑...pass

self是什么?​

self实例对象本身的引用。调用这个方法时,必须先创建类的实例:

api = Jglc_Test_api()  # 创建实例
api.login(session, data)  # 用实例调用方法
  • 限制​:如果 login不需要依赖“某个具体实例的状态”(比如不需要访问实例属性 self.xxx),只是操作类本身的逻辑​(比如验证登录参数、调用接口),那么创建实例就显得多余。

二、为什么要加 @classmethodcls是什么?

@classmethod是 Python 的装饰器,用来定义类方法。此时方法的第一个参数必须是 cls(全称 "class",但名字可以随便取,习惯用 cls)。

1. 类方法的调用方式:不需要实例,直接用类调用

类方法可以直接通过类名调用,不需要先创建实例:

# 直接用类调用,不用创建 api 实例
Jglc_Test_api.login(session, data)

这对你的登录场景很友好——登录通常是“类级别的操作”(比如验证账号密码是否符合类的规则,或调用接口获取 token),不需要绑定某个具体的实例。

2. cls的作用:指向类本身

cls类对象的引用,通过它可以访问:

  • 类属性(比如 cls.base_url,如果类里有 base_url = "https://xxx");

  • 创建类的新实例(比如 new_api = cls(...))。

举个例子,假设你的类里有个类属性 base_url,类方法可以这样用:

class Jglc_Test_api:base_url = "https://127.0.0.1:8088"  # 类属性(所有实例共享)@classmethoddef login(cls, session, login_data):# 用 cls 访问类属性full_url = f"{cls.base_url}/secu-org/hswealth.sus/account/login/login.json"# 发送登录请求...response = session.post(full_url, json=login_data)return response.json()

这里 cls.base_url直接拿到了类里定义的基础 URL,不需要通过实例访问。

三、类方法 vs 实例方法:什么时候用哪个?

类型

第一个参数

调用方式

适用场景

实例方法

self

必须用实例调用(obj.method()

需要访问/修改实例的状态​(比如 self.name

类方法

cls

可以用类直接调用(Class.method()

操作类本身的逻辑​(比如配置、工具方法)

四、结合你的代码场景:为什么用类方法?

你的 login方法是登录接口的工具方法,它的逻辑可能不需要依赖“某个具体的 Jglc_Test_api实例”——比如:

  • 不需要访问实例的属性(比如 self.token,因为登录后会返回 token,不需要存在实例里);

  • 只需要类的公共配置(比如 base_url);

  • 可以直接通过类调用,更方便(比如测试脚本里直接 Jglc_Test_api.login(...))。

五、延伸:静态方法(@staticmethod)的区别

如果类方法里既不需要 cls也不需要 self,可以用 @staticmethod定义静态方法(纯工具函数):

class Jglc_Test_api:@staticmethoddef validate_login_data(login_data):# 验证登录数据的格式(比如是否有 username/password)if not login_data.get("username") or not login_data.get("password"):raise ValueError("用户名或密码不能为空")return True

静态方法不需要 selfcls,纯粹是类名空间下的工具函数,调用方式和类方法一样:Jglc_Test_api.validate_login_data(data)

总结

  • @classmethod​:定义类方法,不需要实例就能调用;

  • cls​:指向类本身,用来访问类属性或创建实例;

  • 你的代码​:login是类级别的工具方法,不需要实例状态,所以用类方法更方便。

一句话记住​:

实例方法属于“对象”,类方法属于“类”——当逻辑不需要绑定具体对象时,就用类方法!

http://www.dtcms.com/a/391684.html

相关文章:

  • Sping AI接入deepseek-本地部署大模型-第二期
  • 数据分析-数据指标体系搭建及应用
  • 计算机专业课《大数据技术》课程导览:开启数据智能时代
  • dumpsys battery 简介
  • 从 CNN 基础到 AlexNet:计算机视觉的破局之路
  • 苏州自动化工厂1台服务器如何5人并发SolidWorks设计
  • 固态硬盘数据恢复一般多少钱?费用分析+恢复教程
  • WebRTC 探秘:构建你自己的实时视频应用
  • 在Ubuntu中离线安装miniconda3
  • Mem0 + 百度智能云向量数据库:为AI打造持久化记忆
  • MySQL 数据归档的技术困境与 Databend 解决之道
  • 2025icpc网络赛第一场The 2025 ICPC Asia East Continent Online Contest (I)
  • docker中ngnix的路径配置
  • 什么是黑板架构风格?
  • Redis 三大核心模式(主从复制 / 哨兵 / 集群):完整部署与问题解析
  • Docker生产环境容器OOM问题定位:镜像内存泄漏还是主机资源不足?
  • AcWing385. GF和猫咪的玩具——Floyd算法
  • 75、封装paddle ocr v5服务支持昇腾800 900 、800I A2、300I DUO卡推理识别
  • 【一文了解】线程的使用
  • 电力系统暂态稳定计算与单机无穷大系统建模
  • OmniGen2 - 智源研究院推出的开源多模态生成模型
  • 【故障排查:JDK8中Files.lines方法错误使用导致的Linux服务器文件描述符泄漏问题】
  • 【multisim仿真电子秒表74LS90】2022-12-15
  • v-show 和 v-if 的区别及使用场景
  • 动态二维码杜绝代签,手机端配置同步,巡检数据更可靠
  • 数据库学习MySQL系列6、MySQL入门简单练习使用
  • 交互式生成对抗网络(iGAN)
  • RecSys: 推荐系统重排与多样性优化(MMR以及DPP算法)
  • 瑞芯微MPP音视频框架---mjpeg解码
  • 模型部署:(七)安卓端部署OCR文本识别项目全流程记录