如何在python中模拟重载初始化函数?

重载初始化函数

重载初始化函数,是指同一个类中定义了多个构造函数,可以通过多种不同的方法进行构造。

举例来说,如果我们创建了一个学生类,在创建学生的时候,需要提供学生的姓名以及出生日期,对于出生日期,我们考虑可以使用date对象,直接进行初始化。也可以分别使用年,月,日进行初始化。或者还可以使用例如2024-11-14日这样的时间字符串进行初始化。

在python中并没有直接的函数重载,但是,我们有多种方法可以实现类似的功能。

python实现

根据对象类型

这种方法根据传入的参数的类型不同,从而实现通过不同的方法进行解析。但是缺点是在类型多的情况下,代码变得非常复杂。

from datetime import dateclass Student:def __init__(self, name, birth_date):if isinstance(birth_date, date):self.birth_date = birth_dateelif isinstance(birth_date, str):try:year, month, day = map(int, birth_date.split("-"))self.birth_date = date(year, month, day)except ValueError:raise ValueError("日期字符串格式应为YYYY-MM-DD")elif isinstance(birth_date, tuple) and len(birth_date) == 3:year, month, day = birth_dateself.birth_date = date(year, month, day)else:raise TypeError("birth_date必须是date对象,YYYY-MM-DD格式的字符串,或(年, 月, 日)的元组")self.name = namedef __str__(self):return f"Student(name={self.name}, birth_date={self.birth_date})"student1 = Student("sagegrass", date(2011, 11, 11))
student2 = Student("sagegrass", "2011-11-11")
student3 = Student("sagegrass", (2011, 11, 11))print(student1)
print(student2)
print(student3)

使用类方法

通常情况下,使用类方法被认为是最好的实践方法,唯一的缺点在于,与常规的初始化略有不同,因此一些用户可能不能适应。

from datetime import dateclass Student:def __init__(self, name, birth_date):if not isinstance(birth_date, date):raise TypeError("birth_date必须是datetime.date类型")self.name = nameself.birth_date = birth_date@classmethoddef from_string(cls, name, birth_date_str):try:year, month, day = map(int, birth_date_str.split("-"))birth_date = date(year, month, day)return cls(name, birth_date)except ValueError:raise ValueError("日期字符串格式应为YYYY-MM-DD")@classmethoddef from_year_month_day(cls, name, year, month, day):try:birth_date = date(year, month, day)return cls(name, birth_date)except ValueError:raise ValueError("日期无效,请使用正确的年月日")def __str__(self):return f"Student(name={self.name}, birth_date={self.birth_date})"student1 = Student("sagegrass", date(2011, 11, 11))
student2 = Student.from_string("sagegrass", "2011-11-11")           
student3 = Student.from_year_month_day("sagegrass", 2011, 11, 11)   print(student1)
print(student2)
print(student3)

使用静态方法

如果将之前使用的类方法,改为静态方法,也是可行的,这样无需再访问类本身。

from datetime import dateclass Student:def __init__(self, name, birth_date):if not isinstance(birth_date, date):raise TypeError("birth_date必须是datetime.date类型")self.name = nameself.birth_date = birth_date@staticmethoddef from_year_month_day(name, year, month, day):try:birth_date = date(year, month, day)return Student(name, birth_date)except ValueError:raise ValueError("日期无效,请使用正确的年月日")def __str__(self):return f"Student(name={self.name}, birth_date={self.birth_date})"student = Student.from_year_month_day("sagegrass", 2011, 11, 11)   print(student)

但是需要注意的是,通常情况下,应该优先使用类方法而非静态方法。因为在包含继承关系的情况下,类方法可以总是保证返回的是子类的实例。而静态方法则会返回父类的实例,从而出现不符合预期的情况。

使用带默认值的参数

当提供了大量的默认值参数,初始化函数会变得复杂和难以理解,缺点与根据对象类型初始化相似。

from datetime import dateclass Student:def __init__(self, name, birth_date=None, year=None, month=None, day=None):if birth_date is not None:if not isinstance(birth_date, date):raise TypeError("birth_date必须是datetime.date类型")self.birth_date = birth_dateelif all([year, month, day]):try:self.birth_date = date(year, month, day)except ValueError:raise ValueError("日期无效,请使用正确的年月日")else:raise ValueError("必须提供birth_date或者年月日的组合")self.name = namedef __str__(self):return f"Student(name={self.name}, birth_date={self.birth_date})"student1 = Student("sagegrass", birth_date=date(2011, 11, 11))  
student2 = Student("sagegrass", year=2011, month=11, day=11)    print(student1)
print(student2)

并且,使用该方法通常无法同时满足使用位置参数进行传入,因此也可以考虑禁止使用位置参数。

# 禁用位置参数
def __init__(self, name, *, birth_date=None, year=None, month=None, day=None):pass# 或者允许birth_date使用位置参数,但不允许年月日用
def __init__(self, name, birth_date=None, *, year=None, month=None, day=None):pass

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

CSS 语法规范

基本语法结构 CSS 的基本语法结构包含 选择器 和 声明块,两者共同组成 规则集。规则集可以为 HTML 元素设置样式,使页面结构和样式实现分离,便于网页的美化和布局调整。 CSS 规则集的结构如下: selector {property: value; }选择器(Selector) 选择器用于指定需要应用…

使用 Python 脚本在 Ansys Mechanical 中创建用于后处理的螺栓工具

介绍 由螺栓连接定义的接头在工业应用中非常普遍。在 Ansys Mechanical FEA 中分析它们是一种非常常见的做法。通过Object Generator或Bolt Tools Add-on,使用线体、梁连接甚至3D实体中的梁单元,在Ansys Mechanical中生成螺栓连接非常容易。定义螺栓联接…

【Excel】数据透视表分析方法大全

数据透视表的最常用的功能是分类汇总,其实它还有很强大的数据分析功能。在数据透视表右键菜单的值显示方式中,可以看到有14个很实用的分析选项。 1、总计的百分比 作用:透视表中每一个数字(包括汇总行、总计行)占右…

电子工牌独立双通道定向拾音方案(有视频演示)

现在一些行业的客服人员在面对客户都要求使用电子工牌分别记录客服和顾客的声音,我们利用双麦克风阵列双波束拾音的方案设计了一个电子工牌方案.可以有效分别记录客服和顾客的声音. 方案思路: 我们采用了一个双麦阵列波束拾音的模块A-59,此模块可以利用2个麦克风组成阵列进行双…

Dubbo 3.x源码(25)—Dubbo服务引用源码(8)notify订阅服务通知更新

基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了接口级的服务引入订阅的refreshInterfaceInvoker方法,当时还有最为关键的notify服务通知更新的部分源码没有学习,本次我们来学习notify通知本地服务更新的源码。 Dubb…

Linux基础1

Linux基础1 Linux基础1学习笔记 ‍ 声明! ​​​学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他…

WSL2安装Ubuntu22.04并开启GPU进行ML学习教程

文章目录 一 启用 WSL2二、安装 Ubuntu三 安装 NVIDIA GPU 驱动和 CUDA 工具四、安装pytouch运行环境 这几天一直在研究下,怎么在笔记本win11电脑上安装linux系统用于机器学习、深度学习、大模型等相关的研究,前面试了VMWARE、HYPER-V等方式,…

用 Python 从零开始创建神经网络(七):梯度下降(Gradient Descent)/导数(Derivatives)

梯度下降(Gradient Descent)/导数(Derivatives) 引言1. 参数对输出的影响2. 斜率(The Slope)3. 数值导数(The Numerical Derivative)4. 解析导数(The Analytical Derivat…

Cyberchef配合Wireshark提取并解析HTTP/TLS流量数据包中的文件

本文将介绍一种手动的轻量级的方式,还原HTTP/TLS协议中传输的文件,为流量数据包中的文件分析提供帮助。 如果捕获的数据包中存在非文本类文件,例如png,jpg等图片文件,或者word,Excel等office文件异或是其他类型的二进…

Java结合ElasticSearch根据查询关键字,高亮显示全文数据。

由于es高亮显示机制的问题。当全文内容过多,且搜索中标又少时,就会出现高亮结果无法覆盖全文。因此需要根据需求手动替换。 1.根据es的ik分词器获取搜索词的分词结果。 es部分: //中文分词解析 post /_analyze {"analyzer":"…

一觉睡醒,全世界计算机水平下降100倍,而我却精通C语言——scanf函数

大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Fei Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。* 这一节我们主要来学习scanf的基本用法,了解scanf返回值,懂得scanf占位符和…

Kafka一些常用的命令行操作【包含主题命令、生产者和消费者命令】

文章目录 1、主题命令2、生产者命令行操作3、消费者命令行操作 1、主题命令 查看当前服务器中的所有 topic: kafka-topics.sh --bootstrap-server node01:9092 --list 创建topic: kafka-topics.sh --bootstrap-server node01:9092 --create --topic to…

基于物联网的温室大棚控制系统

本设计采用物联网方案,用STM32f103c8t6作为主控芯片,采用DHT11作为温湿度传感器,采集CO2使用JW01-CO2-V2.2传感器模块,并且通过BH1750传感器模块采集光照,通过土壤湿度传感器来获取大棚内部土壤湿度,ESP-01…

Ubuntu24安装配置NDK

1、下载NDK 下载压缩包,下载地址如下,建议下载LTS支持版本。 https://developer.android.google.cn/ndk/downloads?hlcs 2、解压缩 将NDK解压到指定文件夹。如:/opt 或者先解压,再移动到指定目录下。 3、配置环境变量 找到…

Python中的HTML

文章目录 一. HTML1. html的定义2. html的作用3. 基本结构4. 常用的html标签5. 列表标签① 无序列表② 有序列表 6. 表格标签7. 表单标签8. 表单提交① 表单属性设置② 表单元素属性设置 一. HTML 1. html的定义 HTML 的全称为:HyperText Mark-up Language, 指的是…

使用etl工具kettle的日常踩坑梳理之二、从Hadoop中导出数据

想操作MySQL等关系型数据库的可以访问我上一篇文章,本章主要介绍操作Hadoop等大数据组件。 根据2024年11月份测试了kettle工具在9.3及以上版本已经没有内置连接大数据(如Hadoop)组件了。 建议安装9.2及以下的,我这里送上8.3.0版本的请用百度网盘下载链…

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具视频汇聚技术在智慧安防监控中的应用与优势

随着信息技术的快速发展和数字化时代的到来,安防监控领域也在不断进行技术创新和突破。NVR管理平台EasyNVR作为视频汇聚技术的领先者,凭借其强大的视频处理、汇聚与融合能力,展现出了在安防监控领域巨大的应用潜力和价值。本文将详细介绍Easy…

智慧安防丨以科技之力,筑起防范人贩的铜墙铁壁

近日,贵州省贵阳市中级人民法院对余华英拐卖儿童案做出了一审宣判,判处其死刑,剥夺政治权利终身,并处没收个人全部财产。这一判决不仅彰显了法律的威严,也再次唤起了社会对拐卖儿童犯罪的深切关注。 余华英自1993年至2…

游戏引擎学习第10天

视频参考:https://www.bilibili.com/video/BV1LyU3YpEam/ 介绍intel architecture reference manual 地址:https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html RDTS(读取时间戳计数器)指令是 x86/x86_64 架构中的…

Asp.net Mvc 电脑销售系统

2 系统实现 2.1 系统框架 该服务平台采用三层架构,以ASP.NET MVC框架为基础 [6]。采用仓库设计的方法,布署灵便。.NET Framework是一个开源框架,适用混合开发。系统软件的集成开发工具是Visual Studio 2019。在数据库的开发中,利…