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
欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;
1、价值上万元的专业的PPT报告模板。
2、专业案例分析和解读笔记。
3、实用的Excel、Word、PPT技巧。
4、VIP讨论群,共享资源。
5、优惠的会员商品。
6、一次付费只需99元,即可下载本站文章涉及的文件和软件。
共有 0 条评论