Classes and Objects – digging deeper Victor Norman CS104 Reading Quiz Vector class • Suppose we want a 2D Vector “type”. • What do we need to store? (what attributes?) – x, y • What operations do we need to be able to do? – – – – – – set and get x, y normalize get magnitude scale add 2 Vectors cross products, dot products, … Write constructor for Vector Write the constructor, which takes params x and y, with default values 0 and 0. class Vector: def __init__(self, x=0, y=0): self._x = x self._y = y constructor Write getters and setters Write the getter and setter for x attribute. class Vector: … def getX(self): return self._x def setX(self, newX): self._x = newX accessor mutator Write getMagnitude() Magnitude is distance of x, y from 0, 0. class Vector: … def getMagnitude(self): return (self._x * self._x + self._y * self._y) ** 0.5 Write normalize() class Vector: … def normalize(self): mag = self.getMagnitude() self._x /= mag self._y /= mag Use it • Create a Vector pointing to 16, 12. vect = Vector(16, 12) • print the vector’s x and y values print(vect.getX(), vect.getY()) • print the magnitude of the vector print(vect.getMagnitude()) • normalize the vector vect.normalize() Printing a Vector • Would be nice to be able to tell a vector object to convert itself to a string representation. Can be done by defining __str__ in the class, so that: – print(vect) calls – str(vect) calls (which happens automatically) – vect.__str__() automatically. • __str__ must return a string representation of the object. Code for __str__ • Suppose we want a vector to be printed this way: – ---16, 12--> class Vector: … def __str__(self): return (“---“ + str(self._x) + “, “ + str(self._y) + “-->”) Adding two vectors. • What if we want to add two vectors together? vect1 = Vector(16, 12) vect2 = Vector(-12, -16) res = vect1 + vect2 print(res) • + is defined for integers, floats, strings, but python can’t just add two Vector objects together without being told how. Defining __add__ • for op1 + op2, intepreter looks at type of op1, and looks if __add__ is defined for it. If it is, it calls it, passing op2 as the 2nd parameter. It returns a new Vector object. class Vector: … def __add__(self, op2): return Vector(self.getX() + op2.getX(), self.getY() + op2.getY()) Other built-in operations • • • • • • __sub__ __mul__ __len__ __int__ __cmp__: for doing ==, <, <=, >, >=, !=, etc. etc.!