Lec 7
Lec 7
PROGRAMMING 2
CS5800: Lecture 7
1
Learning Objectives
• Information hiding
• Hierarchies, inheritance
• Class variables
WHY USE OOP AND
CLASSES OF OBJECTS?
• mimic real life
• group different objects part of the same type
Image Credits, clockwise from top: Image Courtesy Harald Wehner, in the public Domain. Image Courtesy MTSOfan, CC-BY-NC-SA. Image Courtesy Carlos Solana, license CC-
BY-NC-SA. Image Courtesy Rosemarie Banghart-Kovic, license CC-BY-NC-SA. Image Courtesy Paul Reynolds, license CC-BY. Image Courtesy Kenny Louie, License CC-BY
3
6.0001 LECTURE 9 6
GETTER AND SETTER METHODS
class Animal(object):
def __init__(self, age):
self.age = age
self.name = None
def getAge(self):
return self.age
def getName(self):
return self.name
def setAge(self, newage):
self.age = newage
def setName(self, newname=""):
self.name = newname
4
GETTER AND SETTER METHODS
class Animal(object):
def __init__(self, age):
self.age = age
self.name = None
def getAge(self):
return self.age getters
def getName(self):
return self.name
def setAge(self, newage):
self.age = newage
def setName(self, newname=""):
self.name = newname
5
GETTER AND SETTER METHODS
class Animal(object):
def __init__(self, age):
self.age = age
self.name = None
def getAge(self):
return self.age setters
def getName(self):
return self.name
def setAge(self, newage):
self.age = newage
def setName(self, newname=""):
self.name = newname
6
Go to Moodle quiz “getters and setters”
INSTANCE AND DOT NOTATION
8
INFORMATION HIDING
class Animal(object):
def __init__(self, age):
self.years = age
def getAge(self):
return(self.years)
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.getAge() NOT
a.age
◦ good style
◦ easy to maintain code
◦ prevents bugs
9
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"
10
Go to Moodle quiz “hidden variables”
DEFAULT ARGUMENTS
12
DEFAULT ARGUMENTS
13
DEFAULT ARGUMENTS
14
Go to Moodle quiz “default arguments”
HIERARCHIES l s
HIERARCHIES An im a
Image Credits, clockwise from top: Image Courtesy Deeeep, CC-BY-NC. Image Image Courtesy MTSOfan, CC-BY-NC-SA. Image Courtesy Carlos Solana, license CC-BY-NC-SA.
Image Courtesy Rosemarie Banghart-Kovic, license CC-BY-NC-SA. Image Courtesy Paul Reynolds, license CC-BY. Image Courtesy Kenny Louie, License CC-BY. Courtesy
Harald Wehner, in the public Domain.
16
6.0001 LECTURE 9 14
HIERARCHIES
parent class
(superclass) Animal
child class
(subclass)
• inherits all data Person Cat Rabbit
and behaviors of
parent class
• add more info
• add more behavior Student
• override behavior
6.0001 LECTURE 9 15
17
INHERITANCE: PARENT CLASS
class Animal(object):
def __init__(self, age):
self.age = age
self.name = None
def getAge(self):
return self.age
def getName(self):
return self.name
def setAge(self, newage):
self.age = newage
def setName(self, newname=""):
self.name = newname
def __str__(self):
return(“animal:”+str(self.name)+":"+str(self.age))
18
INHERITANCE: PARENT CLASS
• everything is an object
class Animal(object): • class object implements basic
def __init__(self, age): operations in Python, e.g.,
self.age = age binding variables, etc.
self.name = None
def getAge(self):
return self.age
def getName(self):
return self.name
def setAge(self, newage):
self.age = newage
def setName(self, newname=""):
self.name = newname
def __str__(self):
return "animal:"+str(self.name)+":"+str(self.age)
19
INHERITANCE: SUBCLASS
class Cat(Animal):
def speak(self):
print("meow")
def __str__(self):
return "cat:"+str(self.name)+":"+str(self.age)
20
INHERITANCE: SUBCLASS
class Cat(Animal):
def speak(self):
print("meow")
def __str__(self):
return "cat:"+str(self.name)+":"+str(self.age)
21
INHERITANCE: SUBCLASS
class Cat(Animal):
def speak(self):
print("meow")
def __str__(self):
return "cat:"+str(self.name)+":"+str(self.age)
22
INHERITANCE: SUBCLASS
class Cat(Animal):
def speak(self):
print("meow")
def __str__(self):
return "cat:"+str(self.name)+":"+str(self.age)
23
INHERITANCE: SUBCLASS
class Cat(Animal):
def speak(self):
print("meow")
def __str__(self):
return "cat:"+str(self.name)+":"+str(self.age)
26
class Person(Animal): Parent class is Animal
self.friends = []
Add a new data attribute
def get_friends(self):
return(self.friends)
def speak(self): New methods
print("hello")
def add_friend(self, fname):
if fname not in self.friends:
self.friends.append(fname)
def age_diff(self, other):
diff = self.age - other.age
Override Animal's
print(abs(diff), "year difference") __str__() method
def __str__(self):
return(“person:”+str(self.name)+":"+str(self.age))
27
import random
Inherits Person and
class Student(Person): Animal attributes
def __init__(self, name, age, degree=None):
Person.__init__(self, name, age)
self.degree = degree Adds new data attribute
def change_degree(self, degree):
self.degree = degree
def speak(self):
r = random.random() Calls random() method of class
Random
if r < 0.25:
Return float in [0,1)
print("I have homework")
elif 0.25 <= r < 0.5:
print("I need sleep")
elif 0.5 <= r < 0.75:
print("I should eat")
else:
print(“I am watching tv")
def __str__(self):
return(“student:”+str(self.name)+":"+str(self.age)+":"+str(self.degree))
28
Go to Moodle quiz “Extend class”
CLASS VARIABLES
class variables and their values are shared
between all instances of a class
31
CUSTOMISING YOUR OWN TYPES
32
SPECIAL METHOD TO COMPARE
TWO RABBITS
return(parentsSame or parentsOpposite)
33
Go to Moodle quiz “Class variable”
MORE CUSTOMISATION
class Vector(object): 2D Euclidean vector
def __init__(self, x, y):
self.x = x Computes the magnitude 2 2
self.y = y of the vector x + y
def magnitude(self):
return (self.x**2 + self.y**2)**(0.5)
def __abs__(self): Overload abs() function
return self.magnitude()
def __add__(self, other): Overload + operator
v1 = Vector(3, 4)
print(abs(v1)) # Calls Vector.__abs__(v1)
v2 = Vector(-1, -2)
v3 = v1 + v2 # Calls Vector.__add__(v1, v2)
print(v3)
35
MORE CUSTOMISATION
class Vector(object): 2D Euclidean vector
def __init__(self, x, y):
self.x = x Computes the magnitude 2 2
self.y = y of the vector x + y
def magnitude(self):
return (self.x**2 + self.y**2)**(0.5)
def __abs__(self): Overload abs() function
return self.magnitude()
def __add__(self, other): Overload + operator
v1 = Vector(3, 4)
print(abs(v1)) # Calls v1.__abs__()
v2 = Vector(-1, -2)
v3 = v1 + v2 # Calls v1.__add__(v2)
print(v3)
36
POWER OF OOP
37
POWER OF OOP
38
self is this class object
self is an arbitrary instance of this class
self is a reserved Python keyword
self is a convention used to refer to an arbitrary
instance of this class
self is automatically assigned a value when a
method is called on an instance via the "dot"
notation
39