Presentation is loading. Please wait.

Presentation is loading. Please wait.

Classes 3 COMPSCI 105 S2 2015 Principles of Computer Science.

Similar presentations


Presentation on theme: "Classes 3 COMPSCI 105 S2 2015 Principles of Computer Science."— Presentation transcript:

1 Classes 3 COMPSCI 105 S2 2015 Principles of Computer Science

2 Exercise  Exercise  Create a Student class:  The Student class should have three attributes: id, last_name, and first_name.  Create a constructor to initialize the values  Implement the __repr__ method and __str__ method Lecture 06COMPSCI 1052 >>> s1 = Student(1, 'Angela', 'Chang') >>> s1 >>> print(s1) >>> s1 = Student(1, 'Angela', 'Chang') >>> s1 >>> print(s1) Student(1, Angela, Chang) 1: Angela Chang Student(1, Angela, Chang) 1: Angela Chang

3 Reminder – Fraction class  Write a class to represent fractions in Python  create a fraction  add  subtract  multiply  divide  text representation COMPSCI 1053 ½ numerator denominator Lecture 06

4 Overloading Operators  Python operators work for built-in classes.  But same operator behaves differently with different types.  E.g. the + operator:  perform arithmetic addition on two numbers,  merge two lists  concatenate two strings.  Allow same operator to have different meaning according to the context is called operator overloading Lecture 06COMPSCI 1054 OperatorExpressionInternally Additionf1 + f2f1.__add__(f2) Subtractionf1 - f2f1.__sub__(f2) Equalityf1 == f2f1. __eq__(f2)

5 The __add__ method  The __add__ method is called when the + operator is used  If we implement __add__ then we can use + to add the objects  f1 + f2 gets translated into f1.__add__(f2) COMPSCI 1055 x = Fraction(1, 2) y = Fraction(1, 4) z = x + y print(z) x = Fraction(1, 2) y = Fraction(1, 4) z = x + y print(z) def __add__(self, other): new_num = self.__num * other.__den + \ self.__den * other.__num new_den = self.__den * other.__den return Fraction(new_num, new_den) def __add__(self, other): new_num = self.__num * other.__den + \ self.__den * other.__num new_den = self.__den * other.__den return Fraction(new_num, new_den) 6/8 Lecture 06

6 The __sub__ method  The __sub__ method is called when the - operator is used  If we implement __sub__ then we can use - to do subtraction  f1 - f2 gets translated into f1.__sub__(f2) COMPSCI 1056 x = Fraction(1, 2) y = Fraction(1, 4) z = x - y print(z) x = Fraction(1, 2) y = Fraction(1, 4) z = x - y print(z) def __sub__(self, other): new_num = self.__num * other.__den - \ self.__den * other.__num new_den = self.__den * other.__den return Fraction(new_num, new_den) def __sub__(self, other): new_num = self.__num * other.__den - \ self.__den * other.__num new_den = self.__den * other.__den return Fraction(new_num, new_den) 2/8 Lecture 06

7 The __eq__ method  The __eq__ method checks equality of the objects  Default behaviour is to compare the references  We want to compare the contents COMPSCI 1057 def __eq__(self, other): return self.__num * other.__den == \ other.__num * self.__den def __eq__(self, other): return self.__num * other.__den == \ other.__num * self.__den Lecture 06

8 Exercise 1  What is the output of the following code? COMPSCI 1058 x = Fraction(2, 3) y = Fraction(1, 3) z = y + y print(x == z) print(x is z) w = x + y print(w == 1) x = Fraction(2, 3) y = Fraction(1, 3) z = y + y print(x == z) print(x is z) w = x + y print(w == 1) Lecture 06 True False True False Print(w == Fraction(1, 1) Print(w == Fraction(9, 9) Print(w == Fraction(1, 1) Print(w == Fraction(9, 9) True AttributeError: 'int' object has no attribute '_Fraction__den'

9 Improving the __eq__ method  Check the type of the other operand  If the type is not a Fraction, then not equal?  What other decisions could we make for equality? COMPSCI 1059 def __eq__(self, other): if not isinstance(other, Fraction): return False return self.__num * other.__den == \ other.__num * self.__den def __eq__(self, other): if not isinstance(other, Fraction): return False return self.__num * other.__den == \ other.__num * self.__den Lecture 06

10 Improving your code  Fractions:  12/30  2/5  The first fraction can be simplified to 2/5  The Common Factors of 12 and 30 were 1, 2, 3 and 6,  The Greatest Common Factor is 6.  So the largest number we can divide both 12 and 30 evenly by is 6  And so 12/30 can be simplified to 2/5 Lecture 06COMPSCI 10510

11 Greatest Common Divisor  Use Euclid's Algorithm  Given two numbers, n and m, find the number k, such that k is the largest number that evenly divides both n and m. COMPSCI 10511 def __gcd(m, n): while m % n != 0: old_m = m old_n = n m = old_n n = old_m % old_n return n def __gcd(m, n): while m % n != 0: old_m = m old_n = n m = old_n n = old_m % old_n return n Lecture 06

12 Improve the constructor  We can improve the constructor so that it always represents a fraction using the "lowest terms" form.  What other things might we want to add to a Fraction? COMPSCI 10512 class Fraction: def __init__(self, top, bottom): #get the greatest common divisor common = Fraction.__gcd(top, bottom) self.__num = top // common #numerator self.__den = bottom // common #denominator def __gcd(m, n): while m % n != 0: old_m = m old_n = n m = old_n n = old_m % old_n return n class Fraction: def __init__(self, top, bottom): #get the greatest common divisor common = Fraction.__gcd(top, bottom) self.__num = top // common #numerator self.__den = bottom // common #denominator def __gcd(m, n): while m % n != 0: old_m = m old_n = n m = old_n n = old_m % old_n return n Lecture 06

13 Exercise 2  What is the output of the following code? COMPSCI 10513 x = Fraction(2,3) y = Fraction(3,4) z = x + y print(z) w = z - Fraction(7, 12) print(w) print(w + Fraction(1,6) == Fraction(1,1)) x = Fraction(2,3) y = Fraction(3,4) z = x + y print(z) w = z - Fraction(7, 12) print(w) print(w + Fraction(1,6) == Fraction(1,1)) Lecture 06 17/12 5/6 True 17/12 5/6 True

14 Other standard Python operators  Many standard operators and functions: https://docs.python.org/3.4/library/operator.html  Common Arithmetic operators  object.__add__(self, other)  object.__sub__(self, other)  object.__mul__(self, other)  object.__truediv__(self, other )  Common Relational operators  object.__lt__(self, other)  object.__le__(self, other)  object.__eq__(self, other)  object.__ne__(self, other)  object.__gt__(self, other)  object.__ge__(self, other) COMPSCI 10514 Inplace arithmetic operators  object.__iadd__(self, other)  object.__isub__(self, other)  object.__imul__(self, other)  object.__itruediv__(self, other) Lecture 06

15 Exercise 3  Implement the following methods of the Fraction class:  Multiplication  i.e. __mul__  Division  i.e. __truediv__ Lecture 06COMPSCI 10515 a = Fraction(1, 3) b = Fraction(4, 5) c = a * b d = a / b print (c) print (d) a = Fraction(1, 3) b = Fraction(4, 5) c = a * b d = a / b print (c) print (d) 4/15 5/12 4/15 5/12

16 Summary  A class is a template, a blueprint and a data type for objects.  A class defines the data fields of objects, and provides an initializer for initializing objects and other methods for manipulating the data.  The initializer always named __init__. The first parameter in each method including the initializer in the class refers to the object that calls the methods, i.e., self.  Data fields in classes should be hidden to prevent data tampering and to make class easy to maintain.  We can overwrite the default methods in a class definition. COMPSCI 10516Lecture 06


Download ppt "Classes 3 COMPSCI 105 S2 2015 Principles of Computer Science."

Similar presentations


Ads by Google