2016-04-22 12 views
10

Sono obbligato a scrivere una classe che coinvolge le date. Dovrei sovraccaricare l'operatore + per consentire l'aggiunta di giorni alle date. Per spiegare come funziona: Un oggetto Date è rappresentato come (2016, 4, 15) nel formato anno, mese, data. L'aggiunta di un intero 10 a questo dovrebbe produrre (2016, 4, 25). La classe Date ha valori self.year, self.month, self.daycome sovraccaricare correttamente il metodo __add__ in python

Il mio problema è che il codice dovrebbe funzionare nel modulo (Data + 10) e (10 + Data). Anche Date - 1. dovrebbe funzionare nel senso di aggiungere un numero negativo di giorni. Data (2016, 4, 25) - 1 Data di restituzione (2016, 4, 24).

Il mio codice funziona perfettamente nella forma di (Data + 10) ma non nel formato (10 + D) o (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)) 

Questi sono gli errori ottengo

TypeError: tipo di operando non supportato (s) per +: 'int' e 'Data'

TypeError: tipo di operando non supportato (s) per -: 'Data' e 'int'

+4

È necessario implementare anche '__radd__'. – ozgur

+2

Dai un'occhiata a http://stackoverflow.com/a/36745772/5320906. La sottrazione è un'operazione separata per la quale è necessario implementare i metodi '__sub__' e' __rsub__'. – snakecharmerb

+0

Capisco. Quindi se il mio professore mi istruisce a "sovraccaricare l'operatore +", automaticamente intende creare tutti questi metodi? O per dirla in altro modo, l'overloading è definito facendo tutti questi metodi? –

risposta

12

__radd__ gestisce l'aggiunta sul lato destro, quindi è necessario implementare anche quello.

sto vedendo alcuni difetti nell'implementazione quindi vi consiglio di utilizzare il modulo datetime(soprattutto datetime.timedelta classe) ad almeno gestire data di aritmetica di base in modo corretto:

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

Demo :

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