0% found this document useful (0 votes)
105 views24 pages

Python Classes and Inheritance

Download as pdf or txt
Download as pdf or txt
Download as pdf or txt
You are on page 1/ 24

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

You might also like