python模拟重载初始化函数的方法详解!

python模拟重载初始化函数的方法详解!

重载初始化函数,是指同一个类中定义了多个构造函数,可以通过多种不同的方法进行构造,下面我们就来看看在python中如何实现类似的功能吧。

重载初始化函数

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

 

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

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

python实现

根据对象类型

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from datetime import date
class Student:
def __init__(self, name, birth_date):
if isinstance(birth_date, date):
self.birth_date = birth_date
elif 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_date
self.birth_date = date(year, month, day)
else:
raise TypeError("birth_date必须是date对象,YYYY-MM-DD格式的字符串,或(年, 月, 日)的元组")
self.name = name
def __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)

使用类方法

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from datetime import date
class Student:
def __init__(self, name, birth_date):
if not isinstance(birth_date, date):
raise TypeError("birth_date必须是datetime.date类型")
self.name = name
self.birth_date = birth_date
@classmethod
def 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")
@classmethod
def 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)

使用静态方法

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from datetime import date
class Student:
def __init__(self, name, birth_date):
if not isinstance(birth_date, date):
raise TypeError("birth_date必须是datetime.date类型")
self.name = name
self.birth_date = birth_date
@staticmethod
def 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)

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

使用带默认值的参数

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from datetime import date
class 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_date
elif all([year, month, day]):
try:
self.birth_date = date(year, month, day)
except ValueError:
raise ValueError("日期无效,请使用正确的年月日")
else:
raise ValueError("必须提供birth_date或者年月日的组合")
self.name = name
def __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)

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

1
2
3
4
5
6
7
# 禁用位置参数
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

到此这篇关于python模拟重载初始化函数的方法详解的文章就介绍到这了。

 

 

学习资料见知识星球。

以上就是今天要分享的技巧,你学会了吗?若有什么问题,欢迎在下方留言。

快来试试吧,小琥 my21ke007。获取 1000个免费 Excel模板福利​​​​!

更多技巧, www.excelbook.cn

欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;

Excelbook.cn Excel技巧 SQL技巧 Python 学习!

你将获得:

1、价值上万元的专业的PPT报告模板。

2、专业案例分析和解读笔记。

3、实用的Excel、Word、PPT技巧。

4、VIP讨论群,共享资源。

5、优惠的会员商品。

6、一次付费只需99元,即可下载本站文章涉及的文件和软件。

文章版权声明 1、本网站名称:Excelbook
2、本站永久网址:http://www.excelbook.cn
3、本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长王小琥进行删除处理。
4、本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报。
6、本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。

THE END
分享
二维码
< <上一篇
下一篇>>