CS51A - Spring 2022 - Class 15

Example code in this lecture

   person.py
   rectangle.py
   rectangle2.py

Lecture notes

  • administrative
       - NB assignment

  • objects
       - objects have two pieces of information:
          - data
          - methods
       - for example, a list is an object
          >>> l = [1, 2, 3, 4]
          >>> l.append(5)
          >>> l
          [1, 2, 3, 4, 5]
          >>> l.reverse()
          >>> l
          [5, 4, 3, 2, 1]

  • method types
       - there are two types of methods:
          - mutator methods
             - change or mutate the object
          - accessor methods
             - do not change the object
             - ask questions about the object
       - you can look at all of the methods available for an object using help:
          >>> help(l)
          
          or

          >>> help(list) # the type of the object

  • constructors
       - every object has a special method called a constructor
       - it has the same name as the type of the object and can be called on it's own to "construct" a new object
       - Many of the methods we've actually been using already are actually constructors!
          >>> str(10)
          '10'
          >>> int("10")
          10
          >>> float(10)
          10.0

          - all of these construct a new object of that type
       - Some things (like lists and tuples) have special ways of constructing them, but they too also have constructors
          >>> list()
          []
          >>> tuple()
          ()
          >>> list( "abcde" )
          ['a', 'b', 'c', 'd', 'e']
          >>> tuple( "abcde" )
          ('a', 'b', 'c', 'd', 'e')
          >>> tuple( [1, 2, 3, 4] )
          (1, 2, 3, 4)

  • classes
       - a "class" is the blueprint describing what data and methods an object will have
       - an object is an instance of a class
          - for example, we could define a class people
             - people have attributes
             - people will have methods
             - when we define a particular person, it is an object that is an instance of the class people
       - classes define types
          - in Python, since all things are objects, then they all represent instances of objects
          - though in other languages, you could have a type that is not defined by a class


  • defining our own classes
       - syntax:

          class name_of_class:      
             # methods in the class

          - By convention, class names should start with a capital letter
             - if they have multiple words, capitalize each word but do NOT use underscores to separate

             ThisIsMyClassName

             - this is called "camel case"

       - look at Person class in person.py code
          - 5 methods
          - 2 "special" methods
             - methods that are surrounded by two underscores on each side are "special" methods
             - they are generally NOT called directly
             - __init__ defines the constructor for the method
             - __str__ defines what the object will be when it is used in a string context, e.g. printed

       - self
          - self is a variable that allows us to store data and retrieve data in an object
          - self is a reference to the current object
          - it should be the first parameter to every method in a class (not totally true, but fine for this class)
             - though you do NOT include it when you call the methods (this is a little annoying, but you'll get used to it)
             - this is also how we indicate that a function is a method
          - we can access the "data" associated with a class by using self, e.g.
             self.x = 10

             creates a new instance variable (variable associated with this object) called x and assigns it the value 10

       - look at the constructor (__init__ method) in person.py code
          - takes self and two parameters
          - all it does is SAVE these parameters into the object
             - self.name creates a new instance variable called name and stores persons_name into it

       - look at the "get_" methods in person.py code
          - these are accessor methods
          - give us information back
          - notice they only take self as a parameter and use that to give back characteristics about the object

       - look at the "change_shirt" method

       - look at the __str__ method
          - it doesn't take any parameters (except self) and must return a string

  • using classes
       - What will the code at the bottom of the person.py code do when we run it?
          - Creates two instances of the Person class and stores them in separate variables
             - Person(...) is a call to the constructor (__init__)
          - Goes through a week (days 1 to 7) and each day prints out the two people
             - print(p1) will call the __str__ method
          - Uses the accessor methods (get_) to get ask questions about the two
          
       - Run the code at the bottom in person.py code

  • write a class called Rectangle
       - that has a constructor that takes x1, y1, x2, y2 (and self)
       - and one method called area that returns the area of the rectangle
       
  • look at the Rectangle class in rectangle.py code
       - many different ways we could have implemented this
       - in this version, I chose to store the two points as x, y pairs, specifically 4 instance variables:
          self.x1
          self.y1
          self.x2
          self.y2
       - init
          - just saves away the input parameters into instance variables so we can use them later
             self.x1 = x1

             says take the parameter x1 and put its value into the instance variable self.x1
          - this creates 4 instance variables
       
       - area
          - uses the four instance variables to calculate the width and height of the rectangle
          - we need to use abs since we don't specify that the x,y pairs are lower left and upper right corners

       - Using the rectangle class

          >>> r = Rectangle(0, 0, 10, 20)
          >>> r.area()
          200


  • why classes?
       - encapsulation
          - look at the Rectangle class in rectangle2.py code
             - we have the exact same set of methods (constructor and area)
             - however, we have *different* internal representation
                - we store the lower left hand corner (x,y)
                - and the width and height of the rectangle
             - notice that we can ask the exact same questions using this representation
          - anyone using the Rectangle class should NOT care which version we use
             - both have the same set of methods and the same functionality
             - this is the power of using classes, a general framework called object-oriented programming

          - Notice that we can do the same operations and it doesn't change the view from outside the class

             >>> r = Rectangle(0, 0, 10, 20)
             >>> r.area()
             200

       - modularity
          - functions create single units that we can use to build up other functions
          - in the same way, classes allow us to create functional units (in this cases a class of objects with a particular behavior)

       - data sharing
          - classes allow us to share data between methods/functions without having to have them as explicitly parameters
          - this can be very useful (we'll see an example of this for the next assignment)

       - avoid naming conflicts