python mini-course university of oklahoma department of psychology lesson 28 classes and methods...
TRANSCRIPT
Python Mini-CourseUniversity of Oklahoma
Department of Psychology
Lesson 28Classes and Methods
6/17/09Python Mini-Course: Lesson 281
Lesson objectives
1. Create methods inside class definitions
2. Call methods using function syntax and method syntax
3. Create custom __init__ and __str__ methods
4. Use operator overloading
6/17/09Python Mini-Course: Lesson 282
Encapsulation
Data and behaviors are packaged togetherThe object only reveals the interfaces needed to interact with it
Internal data and behaviors can remain hidden
6/17/09Python Mini-Course: Lesson 283
Encapsulating the Time class
Instead of using functions, we want to use methodsMove the functions inside the class definition
6/17/09Python Mini-Course: Lesson 284
The print_time() method
class Time(object):
…
def print_time(self):
"""
Print the time in hour:minute:second format.
"""
print '%02d:%02d:%02d' % \
(self.hour, self.minute, self.second)
6/17/09Python Mini-Course: Lesson 285
Calling a method
Using function syntaxt1 = Time(2,35)Time.print_time(t1)
Using method syntaxt1.print_time()
6/17/09Python Mini-Course: Lesson 286
Converting the other functions to methods
The valid_time methodThe increment methodThe add_time method
6/17/09Python Mini-Course: Lesson 287
The valid_time method
class Time(object):
...
def valid_time(self):
validity = True
# All values must be at least zero
if self.hour < 0 or self.minute < 0 \
or self.second < 0:
validity = False
# Minute and second must be base 60
if self.minute >= 60 or self.second >= 60:
validity = False
return validity
6/17/09Python Mini-Course: Lesson 288
The increment method
class Time(object):
...
def increment(self, t2):
# Check the input arguments
if type(t2) != Time:
raise AttributeError, \
'invalid argument passed to Time.increment()'
if not t2.valid_time():
raise ValueError, \
'invalid Time object passed to Time.increment()'
# Add the times
self.hour += t2.hour
self.minute += t2.minute
self.second += t2.second
6/17/09Python Mini-Course: Lesson 289
The add_time method
class Time(object):
...
def add_time(self, t2):
# Add the times
new_time = Time()
new_time.hour = self.hour + t2.hour
new_time.minute = self.minute + t2.minute
new_time.second = self.second + t2.second
# Return the sum
return new_time
6/17/09Python Mini-Course: Lesson 2810
Using the Time class
t1 = Time(0,0,30)t2 = Time(1,0,45)t1.increment(t2)t1.print_time()t3 = t1.add_time(t2)t3.print_time()t4 = Time.add_time(t1, t2)t4.print_time()
6/17/09Python Mini-Course: Lesson 2811
Improving the Time class
Problems:1. Formatting
1. Minutes and seconds should always be less than 60
2. Printing is awkward3. Adding times is awkward
Solutions: see time_oop1.py
6/17/09Python Mini-Course: Lesson 2812
Keeping the right format
class Time(object):
...
def adjust_base_60(self):
# Increment minutes as necessary and adjust seconds
self.minute += self.second // 60
self.second = self.second % 60
# Increment hours as necessary and adjust minutes
self.hour += self.minute // 60
self.minute = self.minute % 60
6/17/09Python Mini-Course: Lesson 2813
Controlling access to attributes
class Time(object):
...
def set_time(self, hour=0, minute=0, second=0):
self.hour = hour
self.minute = minute
self.second = second
self.adjust_base_60()
6/17/09Python Mini-Course: Lesson 2814
The __str__ method
class Time(object):
…
def __str__(self):
"""
Return the time in hour:minute:second format.
"""
return '%02d:%02d:%02d' % \
(self.hour, self.minute, self.second)
6/17/09Python Mini-Course: Lesson 2815
The __str__ method
The __str__ method is a special method that is called by the str() and print commandst1 = Time(2,45)str(t1)print t1
6/17/09Python Mini-Course: Lesson 2816
Why does this work?
In Python, the most basic class, the object class, defines the __str__ method
Time is a sub-class of the object class, and it inherits this behavior
By defining our own __str__ method we override the base class methodThis is polymorphism
6/17/09Python Mini-Course: Lesson 2817
Operator overloading
We can also define how a class responds to standard operators such as +, -, etc.
This is called operator overloading
6/17/09Python Mini-Course: Lesson 2818
The __add__ method
class Time(object):
...
def __add__(self, other):
return self.add_time(other)
def add_time(self, t2):
new_time = Time()
new_time.hour = self.hour + t2.hour
new_time.minute = self.minute + t2.minute
new_time.second = self.second + t2.second
new_time.adjust_base_60()
return new_time
6/17/09Python Mini-Course: Lesson 2819
Using the __add__ method
t1 = Time(0,0,30)t2 = Time(1,0,45)t3 = t1 + t2print t3print t1 + t2
6/17/09Python Mini-Course: Lesson 2820
Type-based dispatch
Allow us to use different types of arguments for the same method (or function)
6/17/09Python Mini-Course: Lesson 2821
class Time(object):
...
def increment(self, t2):
# Check the input arguments
if type(t2) == Time:
# Add the times
self.hour += t2.hour
self.minute += t2.minute
self.second += t2.second
elif type(t2) == int:
# Increment the seconds
self.second += t2
else:
raise AttributeError, \
'invalid argument passed to Time.increment()'
self.adjust_base_60()
6/17/09Python Mini-Course: Lesson 2822
For more practice, try
Think Python. Chap 17Exercise 17.3, page 165Exercise 17.4, page 166Exercise 17.5, page 167Exercise 17.6, page 169 (debugging exercise)
6/17/09Python Mini-Course: Lesson 2823