Transcript
Page 1: Lesson 28 Classes and Methods

Python Mini-CourseUniversity of Oklahoma

Department of Psychology

Lesson 28Classes and Methods

6/17/09Python Mini-Course: Lesson 281

Page 2: Lesson 28 Classes and Methods

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

Page 3: Lesson 28 Classes and Methods

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

Page 4: Lesson 28 Classes and Methods

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

Page 5: Lesson 28 Classes and Methods

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

Page 6: Lesson 28 Classes and Methods

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

Page 7: Lesson 28 Classes and Methods

Converting the other functions to methods

The valid_time methodThe increment methodThe add_time method

6/17/09Python Mini-Course: Lesson 287

Page 8: Lesson 28 Classes and Methods

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

Page 9: Lesson 28 Classes and Methods

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

Page 10: Lesson 28 Classes and Methods

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

Page 11: Lesson 28 Classes and Methods

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

Page 12: Lesson 28 Classes and Methods

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

Page 13: Lesson 28 Classes and Methods

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

Page 14: Lesson 28 Classes and Methods

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

Page 15: Lesson 28 Classes and Methods

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

Page 16: Lesson 28 Classes and Methods

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

Page 17: Lesson 28 Classes and Methods

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

Page 18: Lesson 28 Classes and Methods

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

Page 19: Lesson 28 Classes and Methods

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

Page 20: Lesson 28 Classes and Methods

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

Page 21: Lesson 28 Classes and Methods

Type-based dispatch

Allow us to use different types of arguments for the same method (or function)

6/17/09Python Mini-Course: Lesson 2821

Page 22: Lesson 28 Classes and Methods

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

Page 23: Lesson 28 Classes and Methods

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

Page 24: Lesson 28 Classes and Methods

Assignment

Think Python. Chap 18Read textType in and run code as you go (save as poker.py)

Do Exercises 18.2 and 18.3 in text

6/17/09Python Mini-Course: Lesson 2824


Recommended