2016-04-22 5 views
10

में __add__ विधि को ठीक से अधिभारित करने के लिए मुझे तारीखों को शामिल करने वाली कक्षा लिखने की आवश्यकता है। मुझे तारीखों में जोड़े जाने की अनुमति देने के लिए + ऑपरेटर को अधिभारित करना है। यह बताने के लिए कि यह कैसे काम करता है: प्रारूप वर्ष, महीने, दिनांक में दिनांक वस्तु (2016,4,15) के रूप में दर्शायी जाती है। इसमें पूर्णांक 10 जोड़ना चाहिए (2016,4,25)। डेट क्लास में स्वयं का मूल्य है। Self.month, self.dayपायथन

मेरी समस्या यह है कि कोड को फॉर्म (दिनांक + 10) के साथ-साथ (10 + दिनांक) में काम करना चाहिए। तिथि भी - 1. दिनों की नकारात्मक संख्या जोड़ने की भावना में काम करना चाहिए। तिथि (2016,4,25) - 1 रिटर्न तिथि (2016,4,24)।

मेरा कोड पूरी तरह से (दिनांक + 10) के रूप में काम करता है लेकिन फॉर्म (10 + डी) या (डी -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)) 

इन त्रुटियों को मैं कर रहे हैं

लेखन त्रुटि: 'int' और 'दिनांक'

लेखन त्रुटि:: के लिए असमर्थित संकार्य प्रकार (ओं) + का समर्थन नहीं संकार्य प्रकार (ओं): - 'तिथि' और '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