gpt4 book ai didi

python - 如何正确重载 __add__ 方法?

转载 作者:太空狗 更新时间:2023-10-29 17:17:12 25 4
gpt4 key购买 nike

我需要编写一个涉及日期的类。我应该重载 +运算符允许将天数添加到日期中。解释它是如何工作的:A Date对象以 (year, month, date) 的格式表示为 (2016, 4, 15)。将整数 10 添加到此应该会产生 (2016, 4, 25)。 Date类有值 self.year , self.month , self.day .

我的问题是代码应该以 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))

这些是我得到的错误

TypeError: unsupported operand type(s) for +: 'int' and 'Date'

TypeError: unsupported operand type(s) for -: 'Date' and 'int'

最佳答案

__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())

演示:

>>> 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

关于python - 如何正确重载 __add__ 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36785417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com