510 likes | 572 Views
Explore advanced concepts of Object-Oriented Programming (OOP) in Python for engineering applications. Learn about classes, methods, constructors, inheritance, and more. Dive into implementing Rational Numbers and Operator Overloading.
E N D
Programming for Engineers in Python Lecture 6: More Object Oriented Programming Autumn 2011-12
Lecture 5 Highlights • Functions review • Object Oriented Programming
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
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
Class as a Blueprint A class is a blueprint of objects
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,…
Shapes – 2D Point, Circle • __init__ • self • Attributes • Instances and memory • Copy (shallow / deep) • Methods
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
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
A Rectangle - Implementation In class Rectangle: Shell:
Find Center In class Rectangle: Shell:
Grow Rectangle In class Rectangle: Shell:
Inheritance (briefly) • The general idea • class Point(object) – what does object stands for? • Example: Animals • Polymorphism • We have seen that already! • Histogram example
Histogram (polymorphism) Source: Think Python
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!
Specification • print should work smoothly • Add, subtract, multiply, divide • Immutable • It should feel like native language support
Constructing a Rational • What are the attributes? • How a client programmer will create a new Rational object?
Constructing a Rational Shell: ?
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:
__repr__ • __repr__ method returns the “official” string representation of an object In class Rational: Shell:
Checking Preconditions • Ensure the data is valid when the object is constructed In class Rational:
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 • +, -, *, /, <, >,…
Define __add__ Method • Immutable In class Rational: Shell:
Other Arithmetic Operations In class Rational:
<, >, max INCORRECT!
<, >, max In class Rational:
<, >, max How come max works?
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)?
Revised Rational In class Rational: Shell:
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
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
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
gcd Implementation • Let’s leave it for next lesson (Recursion) • Actually, we can use the implementation in the module fractions.gcd
Revised Rational In class Rational: Shell:
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
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)
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
__radd__ - Right Side Add • __radd__ invoked when a Rational object appears on the right side of the + operator In class Rational: Shell:
Summary • Customize classes so that they are natural to use • Attributes, methods, constructor • Method overriding • Encapsulation • Define operators as method • Method overloading
Rational Numbers in Python Actually, there is a Python implementation of Rational numbers It is called fractionshttp://docs.python.org/library/fractions.html 50