Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟)...

42
Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai 蔡蔡蔡蔡 () [email protected] Fall, 2015

Transcript of Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟)...

Page 1: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 1

Lecture 9

Defining Classes

Xiaojuan Cai(蔡小娟)

[email protected]

Fall, 2015

Page 2: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 2

Objective• To appreciate how defining new classes can provide

structure for a complex program.

• To understand the concept of encapsulation and

how it contributes to building modular and

maintainable programs.

• To be able to write programs involving simple class

definitions.

• To understand the concepts of encapsulation,

polymorphism and inheritance

Page 3: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 3

Roadmap

• Motivating example: cannon ball

• Define new classes

• Objects and encapsulation

• OO method

Page 4: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 4

Review: objects

• Class: the template of objects, defining

• the types of data an object can have

• and operations it can do.

• Object: the instance of some class

• Objects of the same class can have different data,

• E.g., Student A and B have different ID numbers.

• Message = operation = methods

Page 5: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 5

Review: objects

• Create an object from a class:

<objname> =

<classname>(<param1>,<param2,…>)

• Send message to objects:

<objname>.<methodname>(<param1>,

<param2>,…)

Page 6: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 6

Review: objects• Instance variables: the information stored inside

the object.

• Methods: the operations (functions) “living” inside

the object.

• Attributes: the instance variables and methods.

CircleInstance variables: center, radiusMethods: draw(), getCenter(), ….

Page 7: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 7

Motivating example• Simulate the flight of a cannonball or other

projectile.

• Input:

• launch angle (in degrees),

• the initial velocity (in meters per second),

• and the initial height (in meters) of the cannonball

• Output

• the distance that the projectile travels

Page 8: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 8

Algorithm

• By calculus, we can have a formula.

• By simulation, a little geometry, and

some facts:

• The acceleration of gravity = 9.8 m/s/s.

• Distance = velcocity * time

• No wind

Page 9: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 9

Algorithm1 – cball1.py• Input vel, angle, h0, inv

• theta = angle*(pi/180), xvel = vel *

sin(theta), yvel = vel * cos(theta), x = 0, y =

h0

• While y >= 0

• Compute (x,y,yvel) after an inv

• x = x + xvel*inv, yvel’ = yvel – 9.8*inv, y = y

+ inv*(yvel+yvel’)/2.0, yvel = yvel’

• Output x

Page 10: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 10

Algorithm2 – cball2.py• Modualizing

angle, vel, h0, inv = getInputs()

x,y= 0, h0

xvel, yvel = getXYComponents(vel, angle)

while y >= 0:

x, y, yvel = updateCannonBall(inv, x, y, xvel, yvel)

print "\nDistance traveled: %0.1f meters." % (xpos)

Page 11: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 11

Algorithm2 – cball2.py• Modualizing

angle, vel, h0, inv = getInputs()

x,y= 0, h0

xvel, yvel = getXYComponents(vel, angle)

while y >= 0:

x, y, yvel = updateCannonBall(inv, x, y, xvel, yvel)

print "\nDistance traveled: %0.1f meters." % (xpos)

5 arguments, 3 return values!

Page 12: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 12

Algorithm3 – cball3.py• Make the cball from the class Projectile

• Since all the projectile compute new positions the same way!

• angle, vel, h0, inv = getInputs()

cball = Projectile(angle, vel, h0)

while cball.getY() >= 0:

cball.update(inv)

print "\nDistance traveled: %0.1f meters." %

(cball.getX())

• More readable and understandable!

Page 13: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 13

The Projectile class• __init__ method : initialize the instance variables

of cball.

def __init__(self, angle, velocity,

height):

self.xpos = 0.0

self.ypos = height

theta = pi * angle / 180.0

self.xvel = velocity * cos(theta)

self.yvel = velocity * sin(theta)

Page 14: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 14

Multi-sided dice

• Some games use special dice with a

different number of sides.

• Each MSDie object will know two things:

• How many sides it has.

• It’s current value

• Interfaces

Page 15: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 15

Multi-sided dice>>> die1 = MSDie(6)>>> die1.getValue()1>>> die1.roll()>>> die1.getValue()5>>> die2 = MSDie(13)>>> die2.getValue()1>>> die2.roll()>>> die2.getValue()9>>> die2.setValue(8)>>> die2.getValue()8

Page 16: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 16

Roadmap

• Motivating example: cannon ball

• Define new classes

• Objects and encapsulation

• OO methods

Page 17: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 17

Class definition• Class definitions have the form

class <class-name>:

<method-definitions>

• The first parameter of a method is always named self,

which is a reference to the object on which the method is

acting.

• die1.setValue(8) -> setValue(self, 8)

• __init__

• Instance variables are generated dynamically

Page 18: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 18

The Projectile class

def update(self, time):

self.xpos = self.xpos + time *

self.xvel

yvel1 = self.yvel - 9.8 * time

self.ypos = self.ypos + time *

(self.yvel + yvel1) / 2.0

self.yvel = yvel1

Page 19: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 19

Roadmap

• Motivating example: cannon ball

• Define new classes

• Objects and encapsulation

• OO methods

Page 20: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 20

Encapsulation• The separation of what objects can do and how

they are implemented is called encapsulation.

• Advantages:

• The outside of the class only cares about the interface

• The update and improvements can be done

independently.

• Without worrying about “break” other parts.

Page 21: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 21

Algorithm4 – cball4.py• Put classes in modules.

• Import them when needed. (Code reusable)

• Module documentations, “““docstring “““• Ordinary comments are ignored by Python

• Docstrings are accessible in a special attribute called __doc__.

• >>> import random

>>> print random.random.__doc__

Page 22: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 22

Roadmap

• Motivating example: cannon ball

• Define new classes

• Objects and encapsulation

• OO methods

Page 23: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 23

OOD• Object-oriented design (OOD): data-centered

view of computing:

• The essence of OOD is describing a system in

terms of magical black boxes and their interfaces.

• The separation of concerns of “What” and “How”

makes the design of complex systems possible.

Page 24: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 24

The process of OOD

1. Look for object candidates

• Things that can be represented as

primitive data types (numbers or strings)

are not important object candidates.

• Things to look for: a grouping of related

data items (e.g., point coordinates,

employee)

Page 25: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 25

The process of OOD

2. Identify instance variables

• Some object attributes will have

primitive data types, while others

may be complex types (other useful

objects/classes).

Page 26: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 26

The process of OOD

3. Think about interfaces

• Consider the verbs in the problem

statement

• List the methods that the class will require.

• Remember: all of the manipulation of the

object’s data should be done through the

methods you provide.

Page 27: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 27

The process of OOD

4. Refine the non-trivial methods

• Use top-down design and stepwise

refinement to flesh out the details of

the more difficult methods

Page 28: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 28

The process of OOD

5. Design iteratively

• No one designs a program top to bottom

in a linear, systematic fashion.

• Good design involves a lot of trial and

error!

• Well-designed programs are probably not

the result of a first try.

Page 29: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 29

The process of OOD

6. Keep it simple

• At each step in the design, try to

find the simplest approach that will

solve the problem.

Page 30: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 30

Case study

•高考成绩单管理系统• 每年高考结束后,考生的成绩会寄送到家里。请设计一个高考成绩单管理系统,能够

• 输入准考证号码,查询该学生的各科成绩

• 将所有学生的家庭地址、各科成绩以某种形式写到文件中,以供邮寄成绩单。

Page 31: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 31

1. Look for object candidates

• ScoreManagement

• Students

• HomeAddress

• Score

Page 32: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 32

2. Identify instance variables

• ScoreManagement

• students (a list of Student)

• Student

• name (string), regNo (long), homeAddress (HomeAddress),

scores (a list of Score)

• HomeAddress

• postcode (int), address1 (string), address2 (string)

• Score

• subject (string), grade (float)

Page 33: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 33

3. Think about interfaces

• ScoreManagement

• search(regNo), printAll()

• Student

• getName(), getRegNo(), getHomeAddress(), getScore()

• HomeAddress

• __str__()

• Score

• __str__()

Page 34: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 34

4. Refine non-trivial methods

• search(regNo):

• for s in students:

• if s.getRegNo() == regNo: return s

• …

Page 35: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 35

5. Design iteratively

• homeAddress as a tuple?

• scores as a dictionary?

• Keep it simple and elegant!

Page 36: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 36

OO concepts

• OO is comprised of three

principles:

• Encapsulation (封装 )

• Polymorphism (多态 )

• Inheritance (继承 )

Page 37: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 37

Encapsulation• The packaging of data with a set of operations that

can be performed on the data is called encapsulation.

• Encapsulation separates the concerns of “what” vs.

“how”. The implementation of an object is

independent of its use.

• Advantages:

• Easy to maintain

• Code reuse

Page 38: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 38

Polymorphism• Literally, polymorphism means “many forms.”

• In OO, it means what an object does in

response to a method call depends on the type

or class of the object.

• With polymorphism, a given line in a program

may invoke a completely different method.

Page 39: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 39

Polymorphism• Suppose you had a list of graphics objects – a

mixture of Circle, Rectangle, Polygon, etc.

• You could draw all the items with this simple code:for obj in objects:

obj.draw(win)

• Advantages: flexibility for each object to perform

an action just the way that it should be performed

for that object.

Page 40: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 40

Inheritance• The idea behind inheritance is that a new class

can borrow behavior from another class.

• The “borrowing” class is called a subclass, and

the other (being borrowed) is called a

superclass.

• Advantages:

• code reuse

• flexibility

Page 41: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 41

Inheritance• In the score management system, students may

come from China or US. The forms of home

addresses are different from each other.

• ChinaStudent(Student), USStudent(Student)

• We only need to re-implement printHomeAddress()

for USStudent

• Inheritance + polymorphism are most important

characteristics of OOD and OO languages.

Page 42: Xiaojuan Cai Computational Thinking 1 Lecture 9 Defining Classes Xiaojuan Cai (蔡小娟) cxj@sjtu.edu.cn Fall, 2015.

Xiaojuan Cai Computational Thinking 42

Conclusion• Why classes: Modularity and encapsulation

• Class:

• How to design classes

• Instance variable

• Message

• Class definitions:

• Instance variables are generated dynamically

• Messages always have a parameter self

• OOD and three main concepts for OO