Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

PYTHON LANGUAGE Your assignment is to write the following magic methods for the

ID: 3790680 • Letter: P

Question

PYTHON LANGUAGE

Your assignment is to write the following magic methods for the Date class. Each method must be written in the order asked. Please complete each method to complete the Date class.

1. __eq__ returns True if two Date objects have the same month, day, and year.

2. __add__ is passed an int as a parameter, and adds that number of days to the Date. It is

nondestructive. For example:

3. __getitem__ is passed either an int between 0 and 2, or a str ‘month’, ‘day’, or ‘year’. It returns the appropriate instance variable from the Date object, or raises an exception otherwise. For example:

4. __setitem__ is passed an index (as described in problem 4) and an integer, and sets the month, day, or year of the Date object to be that integer. If the index is not of the correct type or value, then an exception is raised. For example:

Your will receive extra credit if you correctly implement the method below. A correctly implemented version is worth .5 points extra credit.

5. __radd__ is passed an integer, and modifies the Date object to be the specified number of days into the future. It is destructive. For example:

Explanation / Answer

class Date:

def __init__(self, month, day, year):

self.month = month

self.day = day

self.year = year

self._dict = {}

self._dict[1] = self.day

self._dict['day'] = self.day

  

self._dict[0] = self.month

self._dict['month'] = self.month

  

self._dict[2] = self.year

self._dict['year'] = self.year

def _is_leap_year(self, year):

if (year % 4) == 0:

if (year % 100) == 0:

if (year % 400) == 0:

return True

else:

return False

else:

return True

else:

return False

def _get_last_day(self, month, year):

if month == 2:

if self._is_leap_year(year):

return 29

else:

return 28

elif month in [1,3,5,7,8,10,12]:

return 31

else:

return 30

def _add_days(self, days, day, month, year):

last_date = self._get_last_day(month, year)

if day + days > last_date :

days_remaining = days -(last_date-day) - 1

if month == 12:

return self._add_days(days_remaining, 1, 1, year+1)

else:

return self._add_days(days_remaining, 1, month+1, year)

else:

return (day+days, month, year)

def __eq__(self, date):

return (self.month == date.month) and (self.day == date.day) and (self.year == date.year)

def __add__(self, days):

(day, month, year) = self._add_days(days, self.day, self.month, self.year)

return Date(month, day, year)

def __radd__(self, days):

(day, month, year) = self._add_days(days, self.day, self.month, self.year)

self._setItem(1, day)

self._setItem(0, month)

self._setItem(2, year)

def _setItem(self,item_type, item_value):

if item_type == 1 or item_type == 'day':

self._dict[1] = item_value

self._dict['day'] = item_value

self.day = item_value

elif item_type == 0 or item_type == 'month':

self._dict[0] = item_value

self._dict['month'] = item_value

self.month = item_value

elif item_type == 2 or item_type == 'year':

self._dict[2] = item_value

self._dict['year'] = item_value

self.year = item_value

def __getitem__(self, item_type):

if item_type in self._dict:

return self._dict[item_type]

else:

raise IndexError(item_type)

def __setitem__(self, item_type, item_value):

if item_type in self._dict:

self._setItem(item_type, item_value)

else:

raise IndexError(item_type)

def __repr__(self):

return "Date("+str(self.month) + "," + str(self.day) + "," + str(self.year) + ")"

# hope chegg maintain indentation.

# else use this link http://pastebin.com/pZKTjDm7