如何在不导入其他模块的情况下创建一个可以像这样运行的类?
>>date(2014,2,2) + delta(month=3)
>>(2014, 5, 2)
>>
>>date(2014, 2, 2) + delta(day=3)
>>(2014, 2, 5)
>>date(2014, 2, 2) + delta(year=1, month=2)
>>(2015, 4, 2)
这是我的代码:
# class delta(date):
# year = date(year)
# def __init__(self,y,m,d):
# self.y = y + year
# self.m = m
# self.d = d
# def __call__(self):
# return self.y, self.m, self.d
class date(object):
def __init__(self,year,month,day):
self.year = year
self.month = month
self.day = day
def __call__(self):
return self.year, self.month, self.day
答案 0 :(得分:1)
覆盖__add__
方法。在delta类中,给出__init__
默认参数,这样您就可以只使用一个或两个参数调用它。
class delta():
def __init__(self,year=0,month=0,day=0):
self.y = year
self.m = month
self.d = day
def __call__(self):
return self.y, self.m, self.d
class date():
def __init__(self,year,month,day):
self.year = year
self.month = month
self.day = day
def __call__(self):
return self.year, self.month, self.day
def isLeapYear (self):
if ((self.year % 4 == 0) and (self.year % 100 != 0)) or (self.year % 400 == 0):
return True
return False
def __add__(self,delta):
self.year=self.year+delta.y
self.month=self.month+delta.m
if self.month>12:
self.month=self.month%12
self.year+=1
self.day=self.day+delta.d
if self.isLeapYear() and self.day>29:
self.day=self.day%29
self.month+=1
elif not self.isLeapYear() and self.day>28:
self.day=self.day%28
self.month+=1
return self.year, self.month, self.day
print(date(2014, 2, 2) + delta(year=1, month=2)) # (2015, 4, 2)
birthdate=date(1990,1,1)
currentyear=birthdate+delta(year=20,month=2,day=5)
print(currentyear) # (2010, 3, 6)