Programming for Engineers in Python Lecture 6 More

  • Slides: 51
Download presentation
Programming for Engineers in Python Lecture 6: More Object Oriented Programming Autumn 2011 -12

Programming for Engineers in Python Lecture 6: More Object Oriented Programming Autumn 2011 -12 1

Lecture 5 Highlights • Functions review • Object Oriented Programming 2

Lecture 5 Highlights • Functions review • Object Oriented Programming 2

is and == is will return True if two variables point to the same

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 >>> b True >>> b False >>> b True = [1, 2, 3] = a is a == a = a[: ] is a == a 3

Object-Oriented Programming (OOP) • Represent problem-domain entities using a computer language • When building

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 4

Class as a Blueprint A class is a blueprint of objects 5

Class as a Blueprint A class is a blueprint of objects 5

Car Example • Members: 4 wheels, steering wheel, horn, color, … • Every car

Car Example • Members: 4 wheels, steering wheel, horn, color, … • Every car instance has its own • Methods: drive, turn left, honk, repaint, … • Constructors: by color (only), by 4 wheels, engine, … 6

Shapes – 2 D Point, Circle • • • __init__ self Attributes Instances and

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

Code – Define Classes 8

Code – Define Classes 8

Code – Using Classes 9

Code – Using Classes 9

Today • Continue with 2 D Shapes • Rational numbers implementation • It should

Today • Continue with 2 D Shapes • Rational numbers implementation • It should feel like native language support • Inspired by chapter 6 from the book Programming in Scala 10

A Rectangle (design options) • It is not always obvious what the attributes of

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 11

A Rectangle - Implementation In class Rectangle: Shell: 12

A Rectangle - Implementation In class Rectangle: Shell: 12

Rectangle in Memory 13

Rectangle in Memory 13

Find Center In class Rectangle: Shell: 14

Find Center In class Rectangle: Shell: 14

Grow Rectangle In class Rectangle: Shell: 15

Grow Rectangle In class Rectangle: Shell: 15

Has Attributes? 16

Has Attributes? 16

Print All Attributes 17

Print All Attributes 17

Inheritance (briefly) • • The general idea class Point(object) – what does object stands

Inheritance (briefly) • • The general idea class Point(object) – what does object stands for? Example: Animals Polymorphism • We have seen that already! • Histogram example 18

Histogram (polymorphism) Source: Think Python 19

Histogram (polymorphism) Source: Think Python 19

Rational Numbers • A rational number is a number that can be expressed as

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! 20

Specification • • print should work smoothly Add, subtract, multiply, divide Immutable It should

Specification • • print should work smoothly Add, subtract, multiply, divide Immutable It should feel like native language support 21

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

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

Constructing a Rational Shell: ? 23

Constructing a Rational Shell: ? 23

Reimplementing __str__ • __str__ method return a string representation of an object • A

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: 24

__repr__ • __repr__ method returns the “official” string representation of an object In class

__repr__ • __repr__ method returns the “official” string representation of an object In class Rational: Shell: 25

Checking Preconditions • Ensure the data is valid when the object is constructed In

Checking Preconditions • Ensure the data is valid when the object is constructed In class Rational: 26

Checking Preconditions 27

Checking Preconditions 27

Defining Operators • Why not use natural arithmetic operators? • Operator precedence will be

Defining Operators • Why not use natural arithmetic operators? • Operator precedence will be kept • All operations are method calls From the book Programming in Scala 28

Operator Overloading • By defining other special methods, you can specify the behavior of

Operator Overloading • By defining other special methods, you can specify the behavior of operators on user defined types • +, -, *, /, <, >, … 29

Adding Rational Numbers 30

Adding Rational Numbers 30

Define __add__ Method • Immutable In class Rational: Shell: 31

Define __add__ Method • Immutable In class Rational: Shell: 31

Other Arithmetic Operations In class Rational: 32

Other Arithmetic Operations In class Rational: 32

Other Arithmetic Operations 33

Other Arithmetic Operations 33

<, >, max INCORRECT! 34

<, >, max INCORRECT! 34

<, >, max In class Rational: 35

<, >, max In class Rational: 35

<, >, max How come max works? 36

<, >, max How come max works? 36

Default Arguments to Constructor • Constructors other then the primary? • Example: a rational

Default Arguments to Constructor • 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

Revised Rational In class Rational: Shell: 38

Revised Rational In class Rational: Shell: 38

Greatest Common Divisor (gcd) • 66/42 = 11/7 • To normalize divide the numerator

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 39

Off Topic: Calculate gcd (Only if time allows) • gcd(a, b) = g •

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 a else repeat using a b, b a%b • http: //en. wikipedia. org/wiki/Euclidean_algorithm 40

Correctness • Example: gcd(40, 24) gcd(24, 16) gcd(16, 8) gcd(8, 0) 8 • Prove:

Correctness • Example: gcd(40, 24) gcd(24, 16) gcd(16, 8) gcd(8, 0) 8 • Prove: g = gcd(a, b) = gcd(b, a%b)= g 1 • g 1 is a divisor of a ( g 1 ≤ g) • There is no larger divisor of a ( g 1 ≥ g) • ≤ : a = t * b + r a = t * h * g 1 + v * g 1 is a divisor of a • ≥ : assume g > g 1 a = t * b + r g is a divisor of b and r contradiction 41

gcd Implementation • Let’s leave it for next lesson (Recursion) • Actually, we can

gcd Implementation • Let’s leave it for next lesson (Recursion) • Actually, we can use the implementation in the module fractions. gcd 42

Revised Rational In class Rational: Shell: 43

Revised Rational In class Rational: Shell: 43

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

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 44

Usage • The + method invoked is determined in each case by the type

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) 45

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

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 46

Implicit Conversions • 2 + r 2. +(r) method call on 2 (int) int

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 47

__radd__ - Right Side Add • __radd__ invoked when a Rational object appears on

__radd__ - Right Side Add • __radd__ invoked when a Rational object appears on the right side of the + operator In class Rational: Shell: 48

Summary • Customize classes so that they are natural to use • • •

Summary • Customize classes so that they are natural to use • • • Attributes, methods, constructor Method overriding Encapsulation Define operators as method Method overloading 49

Rational Numbers in Python • Actually, there is a Python implementation of Rational numbers

Rational Numbers in Python • Actually, there is a Python implementation of Rational numbers • It is called fractions http: //docs. python. org/library/fraction s. html 50

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

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