2016-04-22 10 views
10

日付を含むクラスを書く必要があります。私は日付に日付を追加できるように+演算子をオーバーロードすることになっています。どのように動作するかを説明する:Dateオブジェクトは、年、月、日の形式で(2016,4,15)として表されます。これに整数10を加えると、(2016,4,25)が得られるはずです。 Dateクラスの値はself.year、self.month、self.dayです。Pythonで__add__メソッドを正しくオーバーロードする方法

私の問題は、コードが(Date + 10)と(10 + Date)の形式で動作することになっていることです。また、Date - 1は、負の数の日を追加するという意味で機能するはずです。日付(2016,4,25) - 1は日付(2016,4,24)を返します。

私のコードは、(日付+ 10)の形式で完全に動作しますが、(10 + D)または(D-1)の形式では動作しません。 : - +のためにサポートされていないオペランドのタイプ(S)::: 'INT' と '日'

はTypeErrorためのサポートされていないオペランドのタイプ(複数可)

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例外を取得エラーです'Date'と 'int'

+4

「__radd__」も実装する必要があります。 – ozgur

+2

http://stackoverflow.com/a/36745772/5320906をご覧ください。減算は '__sub__'と' __rsub__'メソッドを実装する必要がある別の操作です。 – snakecharmerb

+0

私は参照してください。だから私の教授が私に "+演算子を過負荷にする"ように指示すれば、彼は自動的にこれらのメソッドをすべて作成することを意味します。別の言い方をすると、これらのメソッドをすべて実行することによってオーバーロードが定義されますか? –

答えて

12

__radd__右側の追加を処理するので、同様に実装する必要があります。

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

デモ:私はあなたの実装では、いくつかの欠点を見てい

は、私はあなたが、少なくとも正しく基本的な日付の計算を処理するためにdatetimeモジュール(特にdatetime.timedeltaクラス)を使用することをお勧めします:

>>> 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 
関連する問題