Programming for Engineers in Python Lecture 6 More



















































- Slides: 51
Programming for Engineers in Python Lecture 6: More Object Oriented Programming Autumn 2011 -12 1
Lecture 5 Highlights • Functions review • Object Oriented Programming 2
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 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
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 memory Copy (shallow / deep) Methods 7
Code – Define Classes 8
Code – Using Classes 9
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 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
Rectangle in Memory 13
Find Center In class Rectangle: Shell: 14
Grow Rectangle In class Rectangle: Shell: 15
Has Attributes? 16
Print All Attributes 17
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
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 feel like native language support 21
Constructing a Rational • What are the attributes? • How a client programmer will create a new Rational object? 22
Constructing a Rational Shell: ? 23
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 Rational: Shell: 25
Checking Preconditions • Ensure the data is valid when the object is constructed In class Rational: 26
Checking Preconditions 27
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 operators on user defined types • +, -, *, /, <, >, … 29
Adding Rational Numbers 30
Define __add__ Method • Immutable In class Rational: Shell: 31
Other Arithmetic Operations In class Rational: 32
Other Arithmetic Operations 33
<, >, max INCORRECT! 34
<, >, max In class Rational: 35
<, >, max How come max works? 36
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
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 • • 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: 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 use the implementation in the module fractions. gcd 42
Revised Rational In class Rational: Shell: 43
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 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 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 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 the right side of the + operator In class Rational: Shell: 48
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 • It is called fractions http: //docs. python. org/library/fraction s. html 50
Next Week • No class (tirgulim as usual) • Next topic: Recursion 51