1 programming for engineers in python autumn 2011-12 lecture 6: more object oriented programming

Post on 14-Jan-2016

229 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

1

Programming for Engineers in

Python

Autumn 2011-12

Lecture 6: More Object Oriented Programming

2

Lecture 5 Highlights

• Functions review

• Object Oriented Programming

3

is and== is will return True if two variables point to the same object, == if the objects referred to by the variables are equal

>>> a = [1, 2, 3]>>> b = a>>> b is a True>>> b == aTrue>>> b = a[:]>>> b is aFalse>>> b == aTrue

4

Object-Oriented Programming (OOP)

• Represent problem-domain entities using a computer language

• When building a software in a specific domain, describe the different components of the domain as types and variables

• Thus we can take another step up in abstraction

5

Class as a BlueprintA class is a blueprint of objects

7

Shapes – 2D Point, Circle• __init__• self• Attributes• Instances and memory• Copy (shallow / deep)• Methods

8

Code – Define Classes

9

Code – Using Classes

10

Today• Continue with 2D Shapes• Rational numbers implementation

• It should feel like native language support

• Inspired by chapter 6 from the book Programming in Scala

11

A Rectangle (design options)

• It is not always obvious what the attributes of an object should be

• How would you represent a rectangle?• (for simplicity ignore angle, assume the rectangle is

vertical or horizontal)• There are several possibilities:

• One corner / center point + width and height• Two opposing corners

• We shall select the width, height, lower-left corner

12

A Rectangle - ImplementationIn class Rectangle:

Shell:

13

Rectangle in Memory

14

Find Center

In class Rectangle:

Shell:

15

Grow Rectangle

In class Rectangle:

Shell:

16

Has Attributes?

17

Print All Attributes

18

Inheritance (briefly)

• The general idea• class Point(object) – what does object stands for?• Example: Animals• Polymorphism

• We have seen that already!• Histogram example

19

Histogram (polymorphism)

Source: Think Python

20

Rational Numbers

• A rational number is a number that can be expressed as a ratio n/d (n, d integers, d not 0)

• Examples: 1/2, 2/3, 112/239, 2/1

• Not an approximation!

21

Specification• print should work smoothly

• Add, subtract, multiply, divide

• Immutable

• It should feel like native language support

22

Constructing a Rational• What are the attributes?• How a client programmer will create a new Rational

object?

23

Constructing a Rational

?

Shell:

24

Reimplementing __str__• __str__ method return a string representation of an object• A more useful implementation of __str__ would print out

the values of the Rational’s numerator and denominator• override the default implementation

In class Rational:

Shell:

25

__repr__• __repr__ method returns the “official” string

representation of an object

In class Rational:

Shell:

26

Checking Preconditions

• Ensure the data is valid when the object is constructed

In class Rational:

27

Checking Preconditions

28

Defining Operators• Why not use natural arithmetic operators?

• Operator precedence will be kept

• All operations are method calls

From the book Programming in Scala

29

Operator Overloading

• By defining other special methods, you can specify the behavior of operators on user defined types

• +, -, *, /, <, >,…

30

Adding Rational Numbers

31

Define __add__ Method

• Immutable

In class Rational:

Shell:

32

Other Arithmetic Operations

In class Rational:

33

Other Arithmetic Operations

34

<, >, max

INCORRECT!

35

<, >, max

In class Rational:

36

<, >, max

How come max works?

• Constructors other then the primary? • Example: a rational number with a denominator

of 1 (e.g., 5/1 5)• We would like to do: Rational(5)

• Default arguments• Useful not solely for constructors

• Remember sorted (reverse, key are default arguments)?37

Default Arguments to Constructor

38

Revised Rational

In class Rational:

Shell:

39

Greatest Common Divisor (gcd)

• 66/42 = 11/7• To normalize divide the numerator and

denominator by their greatest common divisor (gcd)• gcd(66,42) = 6 (66/6)/(42/6) = 11/7• No need for Rational clients to be aware of this• Encapsulation

40

Off Topic: Calculate gcd(Only if time allows)

• gcd(a,b) = g• a = n * g• b = m * g• gcd(n,m)=1(otherwise g is not the gcd)• a = t * b + r = t * m * g + r g is a divisor of r

• gcd(a,b) = gcd(b,a%b)• The Euclidean algorithm: repeat iteratively:

if (b == 0) return aelse repeat using a b, b a%b

• http://en.wikipedia.org/wiki/Euclidean_algorithm

41

Correctness• Example:

gcd(40,24) gcd(24,16) gcd(16,8) gcd(8,0) 8

• Prove: g = gcd(a,b) = gcd(b,a%b)= g1• g1 is a divisor of a ( g1 ≤ g)• There is no larger divisor of a ( g1 ≥ g)

• ≤ : a = t * b + r a = t * h * g1 + v * g1 g1 is a divisor of a

• ≥ : assume g > g1 a = t * b + r g is a divisor of b and r contradiction

42

gcd Implementation

• Let’s leave it for next lesson (Recursion)• Actually, we can use the implementation in the

module fractions.gcd

43

Revised Rational

In class Rational:

Shell:

44

Mixed Arithmetic's• Now we can add and multiply rational numbers!• What about mixed arithmetic?

• r + 2 won’t work

• r + Rational(2) is not nice

• Add new methods for mixed addition and multiplication

• Will work thanks to polymorphism

45

Usage

• The + method invoked is determined in each case by the type of the right operand

• In our code it is implemented only for the operator + on integers (in “real” life it should have been implemented for every operator and every data type that is supported)

46

Revised __add__• Isinstance takes a value and a class object, and returns

True if the vlaue is an instance of the class• Handles addition of integers correctly• Type based dispatch – dispatches the computation to

different executions based on the types of the arguments

47

Implicit Conversions

• 2 + r 2.+(r) method call on 2 (int) int class contains no __add__ method that takes a Rational argument

• The problem: Python is asking an integer to add a Rational object, and it doesn’t know how to do that

48

__radd__ - Right Side Add

In class Rational:

Shell:

• __radd__ invoked when a Rational object appears on the right side of the + operator

49

Summary• Customize classes so that they are natural

to use• Attributes, methods, constructor• Method overriding• Encapsulation• Define operators as method• Method overloading

50

Rational Numbers in Python

• Actually, there is a Python implementation of Rational numbers

• It is called fractions http://docs.python.org/library/fractions.html

51

Next Week

• No class (tirgulim as usual)• Next topic: Recursion

top related