0% found this document useful (0 votes)
52 views12 pages

Using Inheritance: - Let's Build An Application That Organizes Info About People!

The document describes using inheritance to create a Person class and a MITPerson class that inherits from Person. Person has attributes like name and birthday, while MITPerson adds an ID number attribute. MITPerson's __init__ method initializes attributes from Person and sets a unique ID number. MITPerson also overrides the __lt__ method to sort by ID number rather than name. This allows MITPerson objects to be compared differently than Person objects when using the < operator.

Uploaded by

petejuan
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
52 views12 pages

Using Inheritance: - Let's Build An Application That Organizes Info About People!

The document describes using inheritance to create a Person class and a MITPerson class that inherits from Person. Person has attributes like name and birthday, while MITPerson adds an ID number attribute. MITPerson's __init__ method initializes attributes from Person and sets a unique ID number. MITPerson also overrides the __lt__ method to sort by ID number rather than name. This allows MITPerson objects to be compared differently than Person objects when using the < operator.

Uploaded by

petejuan
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 12

Using Inheritance

Let s build an application that organizes info about people!


Person: name, birthday
Get last name Sort by last name Get age

MITPerson: Person + ID Number


Assign ID numbers in sequence Get ID number Sort by ID number

Building inheritance
class MITPerson(Person): nextIdNum = 0 # next ID number to assign def __init__(self, name): Person.__init__(self, name) # initialize Person attributes # new MITPerson attribute: a unique ID number self.idNum = MITPerson.nextIdNum MITPerson.nextIdNum += 1 def getIdNum(self): return self.idNum # sorting MIT people uses their ID number, not name! def __lt__(self, other): return self.idNum < other.idNum

Visualizing the hierarchy


Person: __init__ getLastName __lt__

MITPerson: nextIDNum: 0 __init__ __lt__

Visualizing the hierarchy


Person: __init__ getLastName __lt__

MITPerson: nextIDNum: 0 __init__ __lt__

Calling MITPerson will use this __init__ procedure (because that is the one visible in MITPersons environment)

Visualizing the hierarchy


Person: __init__ getLastName __lt__

MITPerson: nextIDNum: 0 __init__ __lt__

That code uses Person.__init__ which will in turn call this procedure

Visualizing the hierarchy


Person: __init__ getLastName __lt__

And that creates an instance of MITPerson (because of the first call, which inherits from the class definition) but with bindings set by the inherit __init__ code

MITPerson: nextIDNum: 0 __init__ __lt__

name birthday lastName

Visualizing the hierarchy


Person: __init__ getLastName __lt__

The rest of the original __init__ code calls self.idNum = MITPerson.nextIdNum which looks up nextIdNum in the MITPerson environment, and creates a binding in self (i.e. the instance)

MITPerson: nextIDNum: 0 __init__ __lt__

name birthday lastName idNum 0

Visualizing the hierarchy


Person: __init__ getLastName __lt__

The rest of the original __init__ code calls self.idNum = MITPerson.nextIdNum which looks up nextIdNum in the MITPerson environment, and creates a binding in self (i.e. the instance) And then updates nextIdNum in the MITPerson environment

MITPerson: nextIDNum: 1 __init__ __lt__

name birthday lastName idNum 0

Examples of using this hierarchy


p1 p2 p3 p4 = = = = MITPerson(Eric) MITPerson(John) MITPerson(John) Person(John)

Visualizing the hierarchy


p1 p2 p3 p4 name birthday Eric

lastName idNum 0

name

John

birthday lastName
idNum name birthday lastName John 1

name birthday
lastName idNum

John

Suppose we want to compare things


Note that MITPerson has its own __lt__ method This method shadows the Person method, meaning that if we compare an MITPerson object, since its environment inherits from the MITPerson class environment, Python will see this version of __lt__ not the Person version Thus, p1 < p2 will be converted into p1.__lt__(p2) which applies the method associated with the type of p1, or the MITPerson version

Who inherits
Why does p4 < p1 work, but p1 < p4 doesnt?
p4 < p1 is equivalent to p4.__lt__(p1), which means we use the __lt__ method associated with the type of p4, namely a Person (the one that compares based on name) p1 < p4 is equivalent to p1.__lt__(p4), which means we use the __lt__ method associated with the type of p1, namely an MITPerson (the one that compares based on IDNum) and since p4 is a Person, it does not have an IDNum

You might also like