Python 如何正确地重载uuu add uuuu方法?

Python 如何正确地重载uuu add uuuu方法?,python,class,overloading,Python,Class,Overloading,我被要求写一个包含日期的课程。我应该重载+操作符,以允许将天添加到日期中。为了解释它是如何工作的:Date对象以(年、月、日)的格式表示为(2016、4、15)。将整数10加到这个值上应该会得到(2016,4,25)。Date类具有值self.year,self.month,self.day 我的问题是,代码应该以Date+10以及10+Date的形式工作。另外,Date-1应该在增加负数天数的意义上起作用日期(2016年4月25日)-1返回日期(2016年4月24日) 我的代码以Date+10

我被要求写一个包含日期的课程。我应该重载
+
操作符,以允许将天添加到日期中。为了解释它是如何工作的:
Date
对象以(年、月、日)的格式表示为(2016、4、15)。将整数10加到这个值上应该会得到(2016,4,25)。
Date
类具有值
self.year
self.month
self.day

我的问题是,代码应该以
Date+10
以及
10+Date
的形式工作。另外,
Date-1
应该在增加负数天数的意义上起作用<代码>日期(2016年4月25日)-1返回
日期(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))
这些是我得到的错误

TypeError:不支持+:'int'和'Date'的操作数类型

TypeError:-:'Date'和'int'不支持的操作数类型

处理右侧加法,因此您也需要实现它

我发现您的实现中存在一些缺陷,因此我建议您使用模块(尤其是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())

演示:


您还需要实现
\uuuu radd\uuuu
。减法是一个单独的操作,您需要实现
\uuuuu sub\uuuu
\uuuu rsub\uuuu
方法。我明白了。那么,如果我的教授指示我“重载+运算符”,他会自动创建所有这些方法吗?或者换句话说,重载是通过执行所有这些方法来定义的?是的,通常“重载运算符”意味着扩展或重写运算符的行为,例如+或-。要做到这一点,您需要覆盖相关的特殊方法-参见我之前提到的答案。我们无法告诉你教授的意思,你需要问他们。你的约会课是独立的,还是允许你使用标准的datetime模块的内容?
>>> 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