Python Classes and Inheritance
1
Python Classes and Inheritance
● More on classes
○ Getters and setters
○ Information hiding
○ Class variables
● Inheritance
2
Implementing the Class vs Using the Class
● Write code from two different perspectives
Implementing a new object type with Using the new object type in code
a class
● Create instances of the object
● Define the class type
● Define data attributes (WHAT IS ● Do operations with them
the object)
● Define methods (HOW TO use the
object)
3
Class definition of an object type vs
Instance of a class
● class name is the type ● Instance is one specific object
○ class Coordinate(object) ○ coord = Coordinate(1,2)
● class is defined generically ● Data attribute values vary
○ Use self to refer to some between instances
instance while defining the ○ c1 = Coordinate(1,2)
class ○ c2 = coordinate(3,4)
■ (self.x - self.y)**2 ● c1 and c2 have different data
○ self is a parameter to methods
attribute values c1.x and c2.x
in class definition
because they are different
● class defines data and methods
objects
common across all instances
● Instance has the structure of
the class
4
Why use OOP and classes of objects? (recap)
● Mimic real life
● group different objects part of the same type
5
Groups of objects have attributes (recap)
● Data attributes
○ How can you represent your object with data
○ What it is
■ For a coordinate: x and y values
■ For an animal: age, name
● Procedural attributes
(behaviour/operations/methods)
○ How can someone interact with the object?
○ What it does?
■ For a coordinate: find distance between two
■ For an animal: make a sound
6
How to define a class (recap)
7
Getter and Setter methods
8
An instance and Dot Notation (recap)
● Instantiation creates an instance of an object
○ a = Animal(3)
● dot notation used to access attributes (data and
methods) though it is better to use getters and
setters to access data attributes
○ a.age - access data attribute, allowed, but not recommended
○ a.get_age() - access method, best to use getters and setters
9
Information Hiding
● Author of class definition may change data
attribute variable names
● If you are accessing data attributes outside the
class and class definition changes, may get errors
● Outside of class, use getters and setters instead
○ Use a.get_age() NOT a.age
■ Good style
■ Easy to maintain code
■ Prevents bugs
10
Python not great at information hiding
● Allows you to access data from outside
class definition
○ print(a.age)
● Allows you to write to data from outside
class definition
○ a.age = ‘infinite’
● Allows you to create data attributes for
an instance from outside class definition
○ a.size = “tiny”
● It’s not good style to do any of these!
11
Default arguments
● Default arguments for formal parameters are used if
no actual argument is given
● Default arguments used here
● Argument passed in is used here
12
Hierarchies
13
Hierarchies
● parent class (superclass)
● child class (subclass)
○ Inherits all data and
behaviours of parent class
○ Add more info
○ Add more behaviour
○ Override behaviour
14
Inheritance: Parent Class and Subclass
15
Inheritance subclass explained
● Add new functionality with
speak()
○ Instance of type Cat can be
called with new methods
○ Instance of type Animal throws
errors if called with Cat’s
new method
● __init__ is not missing,
uses the Animal version
16
Which methods to use?
● Subclass can have methods with same name as
superclass
● For an instance of a class, look for method name in
current class definition
● If not found, look for method name up the hierarchy
(if parent, then grandparent, and so on)
● Use first method up the hierarchy that you found
with that method name
17
18
19
Class variables and the Rabbit Subclass
● Class variables and their values are shared between all
instances of a class
● Tag used to give unique id to each new rabbit instance
20
Rabbit getter methods
21
Working with your own types
● Define +operator between two Rabbit instances
○ Define what something like this does: r4 = r1 + r2, where r1 and r2
are rabbit instances
○ r4 is a new Rabbit instance with age 0
○ r4 has self as one parent and other as the other parent
○ in __init__, parent1 and parent2 are of type Rabbit.
22
Special method to compare two rabbits
● Decide that two rabbits are equal if they have the same
two parents
● Compare ids of parents since ids are unique (due to class
var)
● Note you can’t compare objects directly
○ For ex. With self.parent1 == other.parent1
○ This calls the __eq__ method over and over until call it None and
gives an AttributeError when it tries to do None.parent1.
23
Object Oriented Programming Summary
● Create your own collections of data
● Organize information
● Division of work
● Access information in a consistent manner
● Add layers of complexity
● Like functions, classes are a mechanism
for decomposition and abstraction in
programming.
24