2016-04-22 9 views
10

richtig überladen Ich bin verpflichtet, eine Klasse mit Daten zu schreiben. Ich sollte den Operator + überladen, um zu erlauben, dass Tage zu Daten hinzugefügt werden. Um zu erklären, wie es funktioniert: Ein Date-Objekt wird als (2016, 4, 15) im Format Jahr, Monat, Datum dargestellt. Adding Integer 10 zu diesem sollte (2016,4,25) ergeben. Die Date-Klasse hat Werte self.year, self.month, self.dayWie die __add__ Methode in Python

Mein Problem ist, dass der Code in der Form (Date + 10) sowie (10 + Date) funktionieren soll. Auch Datum - 1. sollte in dem Sinne funktionieren, dass eine negative Anzahl von Tagen hinzugefügt wird. Datum (2016,4,25) - 1 gibt das Datum (2016,4,24) zurück.

Mein Code funktioniert perfekt in Form von (Datum + 10), aber nicht in der Form (10 + D) oder (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)) 

Dies sind die Fehler, die ich

Typeerror erhalten: nicht unterstützte Operandtyp (e) für +: 'int' und 'Datum'

Typeerror: nicht unterstützte Operandtyp (e) für: - 'Datum' und 'Int'

+4

Sie müssen auch '__radd__' implementieren. – ozgur

+2

Werfen Sie einen Blick auf http://stackoverflow.com/a/36745772/5320906. Subtraktion ist eine separate Operation, für die Sie die Methoden "__sub__" und "__rsub__" implementieren müssen. – snakecharmerb

+0

Ich sehe. Wenn mein Professor mich anweist, den + Operator zu überladen, bedeutet das automatisch, alle diese Methoden zu erstellen? Oder, um es anders auszudrücken, Überlastung wird durch all diese Methoden definiert. –

Antwort

12

__radd__ Griffe rechten Seite hinzufügen, so dass Sie das auch implementieren müssen.

ich einige Fehler in der Implementierung sehe so empfehle ich Ihnen datetime Modul (insbesondere datetime.timedelta Klasse) richtig Ecktermin Arithmetik zumindest behandeln mit:

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