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

python---静态方法和类方法

文章目录

  • 类方法 (Class Method)
  • 静态方法 (Static Method)
  • 实例方法、类方法和静态方法的区别
  • 如何选择方法?

类方法 (Class Method)

1、定义:使用装饰器 @classmethod 修饰。第一个参数必须是 cls,它指向类本身(不是实例),而不是 self。
2、可以通过类名直接调用,也可以通过实例调用(但更推荐用类名调用,以明确意图)。无论通过哪种方式调用,cls 参数都会自动传入为类本身。
3、权限:不能访问或修改特定的实例属性(因为它没有 self),但可以访问和修改类的属性(通过 cls.attr)。
4、用途:
工厂方法 (Factory Method):作为一种替代构造函数的创建实例的方式,可以提供更清晰的语义(例如,根据不同的参数格式创建对象)。
操作类级状态:当方法需要修改或读取所有实例共享的类变量时。
在继承中,cls 会指向调用它的子类,这使得类方法在继承体系中非常有用。
工厂方法代码:

class Pizza:def __init__(self, ingredients):self.ingredients = ingredientsdef __repr__(self):return f'Pizza({self.ingredients})'@classmethoddef margherita(cls):# `cls` 在这里是 Pizza 类,我们可以调用它来创建实例return cls(['mozzarella', 'tomatoes'])@classmethoddef prosciutto(cls):return cls(['mozzarella', 'tomatoes', 'ham'])# 不需要记住配料,直接使用类提供的工厂方法创建特定口味的披萨
pizza1 = Pizza.margherita() # 通过类调用
pizza2 = Pizza.prosciutto()print(pizza1) # Pizza(['mozzarella', 'tomatoes'])
print(pizza2) # Pizza(['mozzarella', 'tomatoes', 'ham'])# 也可以通过实例调用(不推荐,容易让人困惑)
obj = Pizza(['cheese'])
pizza3 = obj.margherita()
print(pizza3) # 同样创建了一个新的 Pizza 对象

静态方法 (Static Method)

1、定义:使用装饰器 @staticmethod 修饰。它没有强制性的第一个参数(既没有 self,也没有 cls)。
2、调用:可以通过类名直接调用,也可以通过实例调用。
3、权限:不能访问 self 或 cls。因此,它既不能修改实例状态,也不能修改类状态。它就像一个定义在类命名空间里的普通函数。
4、用途:
工具函数:当一个函数在逻辑上属于某个类,但又不需要访问类或实例的任何数据时。将它放在类内部,而不是作为模块级的函数,可以更好地组织代码,表明它与该类在功能上是相关的。

命名空间管理:将相关的功能分组到类下面。
工具函数的代码:

class Calculator:@staticmethoddef add(x, y):return x + y@staticmethoddef multiply(x, y):return x * y# 不需要创建 Calculator 实例,直接通过类名调用
result1 = Calculator.add(5, 3)
result2 = Calculator.multiply(2, 4)print(result1) # 8
print(result2) # 8# 也可以通过实例调用(同样不推荐)
calc_obj = Calculator()
result3 = calc_obj.add(1, 2)
print(result3) # 3

实例方法、类方法和静态方法的区别

特性实例方法类方法 (@classmethod)静态方法 (@staticmethod)
装饰器@classmethod@staticmethod
第一个参数self (实例对象)cls (类对象)无强制参数
访问实例属性是 (通过 self)
访问类属性是 (通过 self.class 或类名)是 (通过 cls)
修改实例状态
修改类状态
主要用途操作或读取实例数据作为工厂方法、操作类级状态工具函数、命名空间组织
调用方式必须通过实例推荐通过类,也可通过实例推荐通过类,也可通过实例

如何选择方法?

1、需要访问或修改实例数据吗?

是 -> 使用 实例方法。

2、不需要访问实例数据,但需要访问或修改类数据(类属性),或者需要作为工厂创建实例吗?

是 -> 使用 类方法。

3、既不需要访问实例数据,也不需要访问类数据吗?

是 -> 使用 静态方法。


文章转载自:

http://JiLJv99V.kxymr.cn
http://QYS3KyoC.kxymr.cn
http://KkSl2P3K.kxymr.cn
http://DDLuragV.kxymr.cn
http://cqn0alWA.kxymr.cn
http://Zx8JaxMu.kxymr.cn
http://NIiVV9Nb.kxymr.cn
http://HNHu98Kp.kxymr.cn
http://flm5EpmZ.kxymr.cn
http://pbmzO1KO.kxymr.cn
http://PFDEEVLb.kxymr.cn
http://yZydAG4o.kxymr.cn
http://9X9ckAST.kxymr.cn
http://vBnx5EEI.kxymr.cn
http://eWcJ5nPy.kxymr.cn
http://q5awha35.kxymr.cn
http://gyBTPiGH.kxymr.cn
http://a5Acj12E.kxymr.cn
http://i8TDWocH.kxymr.cn
http://lfvblepp.kxymr.cn
http://XL324Maw.kxymr.cn
http://cwc0RA3E.kxymr.cn
http://gPUjjMJZ.kxymr.cn
http://o0P4k5bX.kxymr.cn
http://d1vm0ubQ.kxymr.cn
http://1Wu7efLk.kxymr.cn
http://AOP8mK43.kxymr.cn
http://lqYrRBO8.kxymr.cn
http://rtSx6PRq.kxymr.cn
http://mMJ5dnu9.kxymr.cn
http://www.dtcms.com/a/372648.html

相关文章:

  • Nature子刊-香港大学研发新型陡峭山坡巡检无人机,破解密林细小障碍物规避难题
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘setuptools’问题
  • 基于 Django+Vue3 的 AI 海报生成平台开发(海报模块专项)
  • 机器学习-K-means聚类
  • 维度跃迁:当万物皆成电路,智能将从“拥有”变为“存在”
  • 前端:最新最全的JavaScript知识汇总,持续更新......
  • PO BAPI bapi_po_create1
  • 当前车载测试的难点分析
  • Pyhton基础之多继承、多态
  • AOSP Framework开发的一些超方便的快捷命令
  • 移动高清盒子CM311-5-内存大小区分参考指南
  • 在 VirtualBox 虚拟机中安装 Fedora CoreOS 操作系统
  • 【SLAM论文笔记】SplaTAM论文小结
  • shell编程之文本三剑客grep、sed、awk
  • 开始 ComfyUI 的 AI 绘图之旅-文生图(一)
  • 有哪些任务可以使用无监督的方式训练深度学习模型?
  • 从零开始构建图注意力网络:GAT算法原理与数值实现详解
  • FastAPI基础
  • 通过SSH来推送本地文件夹到Github
  • 风锐统计——让数据像风一样自由!(十)——关联研究全自动分析
  • AutoGen快速入门
  • v$lock 查找锁 locked objects ORA-54 dblink
  • Daily算法刷题【面试经典150题-2️⃣】
  • Ucloud技术支持问题
  • 调试 cuda kernel
  • OpenLayers常用控件 -- 章节九:比例尺控件教程
  • 李沐深度学习论文精读(一)AlexNet + ResNet
  • CMake构建C++项目,报错“CMake Error CMAKE_C_COMPILER not set, after EnableLanguage”
  • 2025最新超详细FreeRTOS入门教程:第五章 FreeRTOS信号量
  • 安卓逆向(二)相关问题及解决方案