当我们在编写一个类时,我们希望用户可以通过多种不同的方式来创建一个类实例,而不是局限于_init_()方法提供的一种。这个时候,就需要我们创建多个构造函数了。
下面是一个简单的实例:
import time
class Date:
#主构造函数
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
#可选构造函数
@classmethod
def today(cls):
t = time.localtime()
return cls(t.tm_year, t.tm_mon, t.tm_mday)
使用示例:
>>> a = Date(2012,12, 21)
>>> b = Date.today()
>>> print(a.year, a.month, a.day)
2012 12 21
>>> print(b.year, b.month, b.day)
2018 9 13
在可选构造函数中,我们定义了一个类方法,类方法的第一个参数(cls)指代的就是类本身。类方法会用这个类来创建并返回最终的实例。使用类方法的另一个好处就是在继承的时候,保证了子类使用可选构造函数构造出来的类是子类的实例而不是父类的实例。
也许我们会倾向于在_init_()方法中使用*args和**kwags根据参数数量来进行判断如何执行构造函数。以下为实例:
import time
class Date:
def __init__(self,*args):
if len(args)==0:
t = time.localtime()
args = (t.tm_year, t.tm_mon, t.tm_mday)
self.year, self.month, self.day = args
尽管这样也是行的通的,但是这样往往会导致代码更加脆弱而且难以维护。而且在实现时也不会展示出那么有用的帮助字符串(没有参数名称)。此外,在创建实例时,代码也会变得不那么清晰。看看下面的对比:
>>> a = Date(2012,12,31)#明确指定日期
>>> b = Date()#信息模糊,指示不明
>>> c = Date.today()#清晰,指定今日