Jof*_*eon 14 python overloading class
我需要写一个涉及日期的课程.我应该重载+运算符以允许将日期添加到日期.解释它Date是如何工作的:一个对象以年,月,日的格式表示为(2016,4,15).向此添加整数10应该会产生(2016,4,25).该Date班有值self.year,self.month,self.day.
我的问题是代码应该在form(Date + 10)和(10 + Date)中工作.还有Date - 1.应该在添加负数天的意义上工作.Date(2016, 4, 25) - 1回报Date(2016, 4, 24).
我的代码完美地以(Date + 10)的形式工作,但不是以(10 + D)或(D - 1)形式.
def __add__(self,value):
if type(self) != int and type(self) != Date or (type(value) != int and type(value) != Date):
raise TypeError
if type(self) == Date:
day = self.day
month = self.month
year = self.year
value = value
if type(value) != int:
raise TypeError
days_to_add = value
while days_to_add > 0:
day+=1
if day == Date.days_in(year,month):
month+=1
if month > 12:
day = 0
month = 1
year+=1
day = 0
days_to_add -=1
return(Date(year,month,day))
Run Code Online (Sandbox Code Playgroud)
这些是我得到的错误
TypeError: unsupported operand type(s) for +: 'int' and 'Date'
TypeError: unsupported operand type(s) for -: 'Date' and 'int'
ozg*_*gur 17
__radd__ 处理右侧添加,所以你也需要实现它.
我在你的实现中看到了一些缺陷所以我建议你使用datetime模块(特别是datetime.timedelta类)来至少正确地处理基本日期算术:
import datetime
class Date(object):
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
def as_date(self):
return datetime.date(self.year, self.month, self.day)
def __add__(self, other):
if isinstance(other, int):
date = self.as_date() + datetime.timedelta(days=other)
return Date(date.year, date.month, date.day)
else:
raise ValueError("int value is required")
def __radd__(self, other):
return self.__add__(other)
def __sub__(self, other):
return self.__add__(-other)
def __rsub__(self, other):
raise RuntimeError("Doesn't make sense.")
def __repr__(self):
return str(self.as_date())
Run Code Online (Sandbox Code Playgroud)
演示:
>>> date = Date(2015, 10, 23)
>>> print date + 10 # __add__ is called
2015-11-02
>>> print 20 + date # __radd__ is called
2015-11-12
>>> print date - 25 # __sub__ is called
2015-09-28
>>> print 25 - date # __rsub__ is called
RuntimeError: Doesn't make sense
Run Code Online (Sandbox Code Playgroud)