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

在 Python 里,@staticmethod 和 @classmethod 都是放在类里面的方法,但它们绑定对象不同。

在 Python 里,@staticmethod@classmethod都是放在类里面的方法,但它们绑定对象不同

1. 普通实例方法

最常见的是这种:

class User: def say_hello(self): print("hello")

调用:

u = User() u.say_hello()

这里的self表示当前对象实例

也就是说,实例方法可以访问:

self.name self.age self.xxx

适合处理和某个具体对象有关的数据


2.@staticmethod:静态方法

class MathUtils: @staticmethod def add(a, b): return a + b

调用:

print(MathUtils.add(1, 2))

它的特点是:

@staticmethod def 方法名(...):

不需要self,也不需要cls

也就是说,它不关心当前对象是谁,也不关心当前类是谁

它只是被放在类里面,起到一个“工具函数”的作用。

例如:

class FileUtils: @staticmethod def is_json_file(filename): return filename.endswith(".json")

使用:

FileUtils.is_json_file("data.json")

这种方法其实跟普通函数差不多,只是为了代码组织清晰,所以放到类里面。

适合场景:

这个函数逻辑上属于这个类, 但它不需要访问对象属性,也不需要访问类属性。

3.@classmethod:类方法

class User: count = 0 @classmethod def get_count(cls): return cls.count

调用:

print(User.get_count())

它的特点是:

@classmethod def 方法名(cls, ...):

第一个参数是cls,表示当前类本身

它可以访问类属性:

cls.count cls.config cls.xxx

也可以用来创建对象。

例如:

class User: def __init__(self, name, age): self.name = name self.age = age @classmethod def from_dict(cls, data): return cls(data["name"], data["age"])

使用:

data = {"name": "张三", "age": 18} user = User.from_dict(data) print(user.name) print(user.age)

这里的from_dict就是一个典型的类方法。

它的作用是:根据字典数据创建一个User对象。


4. 三者区别总结

类型第一个参数能访问实例属性能访问类属性典型用途
实例方法self可以可以操作具体对象
静态方法不可以不直接访问工具函数
类方法cls不可以直接访问可以操作类本身、创建对象

5. 通俗理解

可以这样记:

self:操作某一个具体对象 cls:操作这个类本身 staticmethod:只是放在类里的普通工具函数

例如:

class Person: species = "human" def __init__(self, name): self.name = name def instance_method(self): print(self.name) @classmethod def class_method(cls): print(cls.species) @staticmethod def static_method(a, b): return a + b

调用:

p = Person("张三") p.instance_method() # 用对象数据 Person.class_method() # 用类数据 Person.static_method(1, 2) # 普通工具函数

简单说:

需要用对象数据 → 普通方法 self 需要用类数据 → @classmethod cls 谁的数据都不用 → @staticmethod
http://www.jsqmd.com/news/1104049/

相关文章:

  • 5分钟解决Mac Boot Camp驱动难题:Brigadier自动化工具完整指南
  • HarmonyOS7 搜索页最容易做成半成品:历史、热词、结果页这次一次补齐
  • 吴恩达《深度学习》之看懂超参数搜索的“对数标尺”
  • B站评论采集实践:如何快速获取评论数据并接入AI分析平台
  • 移动网络用户访问异常专项:为什么移动投诉往往最多
  • 【量化实战】基于LLMCompressor一键落地vLLM部署
  • 鸿蒙操作系统是否超越安卓?
  • 网站站长每天必做的工作有哪些?
  • DeepSeek正式官宣摇人,夯!
  • 西门子罗宾康 A1A10000423.00M 高压变频器 I/O 板
  • 赛克艾威早报20260630:Oracle EBS与Apache HTTP Server曝高危漏洞,多款产品遭在野利用
  • rat与生态系统集成:如何将高性能文件查看器融入你的开发工作流
  • 当灯光“躲”进陪伴机器人:智能照明的隐藏式进化与异业合作新浪潮
  • Windows 11系统优化神器:Win11Debloat让你的电脑性能提升51%的秘密
  • 从零到一:在STM32上跑通TinyML的完整实践指南
  • 2026年AI建站平台哪个好?企业官网、SEO和GEO能力对比
  • ABAP :新语法 - REF
  • 编写自动化脚本时使用多线程技术
  • LangChain4j Guardrails:给你的 AI Service 装上输入输出双层卡口
  • Windows10上安装MySQL操作步骤
  • 纯小白零基础漏洞挖掘完整教程,从理论到实操一步到位,看完即可上手提交漏洞拿赏金
  • 论文格式改 3 遍还不合格?笔墨 AI 一键匹配院校模板,不用手动调半天
  • 多场景学术写作一站式解决方案,paperxie 智能论文写作功能拆解实测
  • 使用JMeter进行gRPC微服务性能测试的完整指南
  • 优化数据库查询性能的五个实用技巧
  • 哔哩下载姬完整指南:告别网络焦虑,轻松掌控B站视频资源
  • 简单聊一下JAX
  • 3个关键突破:如何用dnSpyEx解决.NET逆向工程的核心痛点?
  • 工业4-20mA电流环设计:DAC161S997与PIC32实战解析
  • 工业清洁机器人智能化应用与厂区使用优势