1 / 51

Programming for Engineers in Python

Programming for Engineers in Python. Lecture 6 : More Object Oriented Programming. Autumn 2011-12. Lecture 5 Highlights. Functions review Object Oriented Programming. is and ==.

Download Presentation

Programming for Engineers in Python

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  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 Blueprint A class is a blueprint of objects

  6. 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,…

  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 - Implementation In 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 28

  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?

  37. 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)?

  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 a else 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 46

  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 • __radd__ invoked when a Rational object appears on the right side of the + operator In class Rational: Shell:

  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 fractionshttp://docs.python.org/library/fractions.html 50

More Related