Python中备选构造函数,classmethod和staticmethod的用法

news/2024/9/23 10:51:11/

在Python官方教程中并没有提及classmethod和staticmethod这两个装饰器。学过java面向对象编程的同学可能会觉得奇怪,为什么Python提供两个这样的装饰器,而不是只提供一个?

我们先来看看classmethod,它的用法:定义操作类而不是操作实例的方法。由于classmethod改变了调用方法的方式,因此接收的第一个参数是类本身(一般叫做cls),而不是实例。classmethod可以访问类的属性,并且可以通过cls参数来创建类的实例。classmethod最常见的用途是定义备选构造函数。

什么是备选构造函数:在Python中,备选构造函数指的是类中的一个特殊方法,通常称之为__init()__方法之外的另一个初始化方法。这种方法允许你以不同的方式初始化类的实例。备选构造函数通常被用来提供更灵活的对象创建方式,或者允许从不同的数据源创建对象。

备选构造函数通常通过类方法来实现。我们直接看下面的实现代码:

python"># 备选构造函数
class Person:current_year = 2024  # 类属性def __init__(self, name: str, age: int):self.name = nameself.age = age@classmethoddef from_birth_year(cls, name: str, birth_year: int) -> 'Person':  # 第一个参数不是self,而是类本身age = cls.current_year - birth_yearreturn cls(name, age)person = Person('cj', 24)  # 使用init初始化构造实例
print(person.name)  # cj
print(person.age)  # 24person = Person.from_birth_year('jay', 1999)  # 使用备选构造函数创建实例
print(person.name)  # jay
print(person.age)  # 25

注意from_birth_year最后一行使用cls创建了一个新实例,即cls(name,age)。

相比之下,staticmethod装饰器也会改变方法的调用方式,使其接收的第一个参数没什么特殊的。其实,静态方法就是普通的函数,只是正好位于类的定义体中,而不是在模块层定义。他不能访问类属性或实例属性,并且与类的其余部分无关。通常在与类有关联但不需要访问类或实例的情况下使用静态方法。

我们比较一个classmethod和staticmethod的行为

python">class Demo:@staticmethoddef static_(*args):return args@classmethoddef class_(*args):return argsprint(Demo.static_())  # ()
print(Demo.static_('hello'))  # ('hello',)
print(Demo.class_())  # (<class '__main__.Demo'>,)
print(Demo.class_('hello'))  # (<class '__main__.Demo'>, 'hello')

可以看出,不管怎么调用类方法装饰的方法,它的第一个参数始终是Demo类,而静态方法装饰的方法与普通方法没啥区别。

classmethod装饰器非常有用,但是并没有出现过不得不使用staticmethod的情况。有些函数即使不直接处理类,也与类关系紧密,因此你会想把函数和类放到一起定义。对于这种情况,也可以在类的前面或后面定义函数,保持二者在同一个模块中也是可行的。至于选择哪种方式,还是请自辩。

 


http://www.ppmy.cn/news/1449273.html

相关文章

【设计模式】之模板方法模式

系列文章目录 【设计模式】之策略模式 【设计模式】之责任链模式 文章目录 系列文章目录 前言 一、什么是模板方法模式 定义 角色 二、为什么要使用模板方法模式 优点 缺点 三、案例 普通案例 模拟Servlet过程案例 总结 前言 今天给大家介绍23种设计模式中的模板方法模式&a…

2024 java使用Graceful Response,告别自己去封装响应,可以接收数据异常,快看我这一篇,足够你用!

参考官网手册地址&#xff1a;快速入门 | Docs 一、导入依赖&#xff08;根据springboot查看对应依赖版本&#xff09; <!-- Graceful --><dependency><groupId>com.feiniaojin</groupId><artifactId>graceful-response</artifactId&g…

在ubuntu 24.04 上安装vmware workstation 17.5.1

ubuntu安装在新组装的i9 14900机器上&#xff0c;用来学习笨叔的ARM64体系结构编程&#xff0c;也熟悉Linux的用法。但有时候写文档总是不方便&#xff0c;还是需要window来用。因此想在ubuntu 24.04上安装Linux版本的vmware worksation 17.5.1以虚拟机的方式安装windows 11。其…

分布式与一致性协议之Raft算法(四)

Raft算法 Raft是如何解决成员变更问题的 在日常工作中&#xff0c;你可能会遇到服务器故障的情况&#xff0c;这时你需要替换集群中的服务器。如果遇到需要改变数据副本数的情况&#xff0c;则需要增加或移除集群中的服务器。总的来说&#xff0c;在日常工作中&#xff0c;集…

【杂谈】空格还是Tab?

目录 一、Tab键和空格键的区别 二、Tab键的优势劣势 三、空格的优势劣势 四、为什么不提倡Tab 一、Tab键和空格键的区别 TAB叫做制表符&#xff0c;就是制表用的&#xff0c;或者说是对齐用的&#xff0c;属于控制字符&#xff0c;按下后一次空出2/4/8个字符的位置&#xf…

2024第84届中国(云南昆明)教育装备展示会

关于第84届中国教育装备展示会将在云南昆明举办&#xff01; 谨此奉邀! 第84届中国教育装备展示会组委会 一、展会时间、地点 布展时间&#xff1a;2024年10月22日-24日 开展时间&#xff1a;2024年10月25日-27日 撤展时间&#xff1a;2024年10月27日 16:00-24:00 地点&a…

Virtualbox7.0.10--创建虚拟机

前言 下载Virtualbox7.0.10&#xff0c;可参考《Virtualbox–下载指定版本》 Virtualbox7.0.10具体安装步骤&#xff0c;可参考《Virtualbox7.0.10的安装步骤》 Virtualbox7.0.10创建虚拟机&#xff0c;可参考《Virtualbox7.0.10–创建虚拟机》 Virtualbox7.0.10安装Ubuntu20.0…

Python转换文本文件为PDF文档,绘制文本到PDF文档页面

文本文件因其轻便、易编辑的优势&#xff0c;常用于日常文字记录与数据交换&#xff1b;而PDF文档则以高保真、格式稳定和良好的阅读体验&#xff0c;成为正式报告、文献发布等场景的首选。将文本文件转为PDF&#xff0c;在PDF内精准绘制文本&#xff0c;旨在兼顾内容的规范呈现…