CS104: Chapter 15 CS 104 Students and me Big Question Q: You say creating a class is how to create a new type. Why would we even want to do this?! A: First, to group data together that belongs together. (Second, to group operations on the data with the data. But, more on that, in due course.) Grouping Data • The only data structures we have are lists and tuples. • We can store multiple related data items together in a list or tuple, and then keep a list of these lists/tuples. • E.g., cars = [ (“Honda”, “Odyssey”, 2001, “silver”, “VIN1523y7380”), (“Toyota”, “Prius”, 2007, “blue”, “VIN99383829X95”), …] Accessing Data • If we need to compute with the i-th car’s color, we do: car = cars[i] # car is a tuple if car[3] == “blue”: # do something… • Or, was it car[4]? car[5]? If we have 55 items to keep for a car how do we remember which number is in which place in the tuple of a car? How can we make the code readable? A better way • Would be nice to make a container to hold multiple data items, and each attribute in the structure has a nice name. • Kind of like a row in Excel, where you give a name to each column. • Then, you could access the cars’ colors, by car = cars[i] if car.color == “blue”: # do something… So… • We need a way to group multiple attributes of something into a single container, and then be able to access, with nice names, the attributes in the container. • Enter: the class. Terminology • A class defines the template or recipe for what an object looks like – i.e., what attributes it has. • Defining a class does not make any variables (called objects). It just defines what an object would hold if you did create one. • You instantiate a class to make an object, aka a variable. An object is also called an instance of a class. Example: Car class class Car: # “class” is like “def”, but for # classes, not functions. def __init__(self): “””Constructor for a Car.””” self._make = “” self._model = “” self._yr = 1900 self._color = “” # main code: instantiate some car objects car1 = Car() # call __init__, the constructor. car1._make = “Honda” car1._model = “Odyssey” # etc car1._yr = 2001 car1._color = “silver” Using a car instance • Now that we’ve wrapped up multiple attributes into one container (i.e., “object”), and given each a nice readable name, we can deal with each container as one thing. – get/set values in it – pass it as a parameter – return it from a function – sort the objects, without mixing up whose values go with whose… Technical Details • If student is an object (of class Student) with attribute, id, you can access it with student.id. • Similar to module.variable or module.func() • module != class. Module is a file containing variable, function (and class) definitions. Class is a new type. But both are containers. Q and As • Can you talk more about the object diagrams? • Can you walk through the example in which you are making/defining the class point on page 3 -- specifically where “p is an alias for blank”? • Is there a limit to the amount of attributes a class can have? Q and As (2) • We talk about how objects are mutable, but if we can define the attributes of a created object can we define them to be immutable? • Is a “class definition” like a “function definition” with just a different kind of pattern? (Does it work similar to a function definition?) Q and A (3) • Why doesn't the class “Point” clarify what its attributes are? How do you know what the attributes of a class are?