Class LeapDate

To create a smarter class that knows about leap years, I began by adding the length method to the base class Date. Then I overrode this method with a smarter length method in the subclass LeapDate.

"""
This module is date.py
"""

import calendar

class Date(object):
    "Class Date thinks there are no leap years."

    lengths = [
        None,
        31, #January
        28, #February
        31, #March
        30, #April
        31, #May
        30, #June
        31, #July
        31, #August
        30, #September
        31, #October
        30, #November
        31  #December
    ]

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

    def __str__(self):
        "Return a string that looks like the contents of myself."
        return f"{self.month:02}/{self.day:02}/{self.year:04}"

    def length(self, month, year):
        return Date.lengths[month]

    def nextDay(self):
        "Move myself one day into the future."
        if self.day < self.length(self.month, self.year):
            self.day += 1
        else:
            self.day = 1       #Go to the first day of the next month.
            if self.month < len(Date.lengths) - 1:
                self.month += 1
            else:
                self.month = 1 #Go to the first month of the next year.
                self.year += 1


class LeapDate(Date):
    "Class LeapDate knows which years are leap years."

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

    def length(self, month, year):
        if month == 2 and calendar.isleap(year):
            return 29
        return super().length(month, year)


if __name__ == "__main__":
    import sys
    import datetime
    d = LeapDate(2, 28, 2020)
    d.nextDay()
    print(f"The date after 2/28/2020 is {d}.")
    sys.exit(0)
import sys
import date   #the above date.py module

d = date.Date(2, 28, 2020)
d.nextDay()
print(d)

ld = date.LeapDate(2, 28, 2020)
ld.nextDay()
print(ld)
03/01/2020
02/29/2020

Things to try

  1. Make a class smart enough to know that there was no year 0 in between 1 BC and 1 AD.
  2. Make a class smart enough to handle the adoption of the Gregorian calendar.
    cal 9 1752
       September 1752     
    Su Mo Tu We Th Fr Sa  
           1  2 14 15 16  
    17 18 19 20 21 22 23  
    24 25 26 27 28 29 30