Classes and Objects, Part 1
E N D
Presentation Transcript
Classes and Objects, Part 1 Victor Norman CS104
“Records” • In Excel, you can create rows that represent individual things, with each column representing some property of that thing. • E.g., each row could represent a student, with • column 1: student id • column 2: student last name • column 3: student first name • column 4: gpa • column 5: how much tuition is owed… • Each row *must* stay together: don’t want to move values from one row to another.
How to do this in python? • How could we make a collection of items/values that belong together? • Have to use a composite data type. • i.e., lists or tuples. • Question: does order of items/values really matter?
Ancient History (last Thursday) • A card is a tuple with 2 parts, a suit (one of “s”, “d”, “c”, “h”) and a number (2 – 14). • We create a card by making a tuple. • We access the suit via card[0] and number via card[1]. • What is good and what is bad about this implementation?
What types of variables can we make? • Is this good enough? Wouldn’t it be nice if we could create our own types?
Using a List/Tuple to store data • If we want to group together data into one structure/record, we could use a list (or a tuple): student1 = [‘Dan’, 4, [80, 82, 6]] student2 = [‘Paula’, 2, [49, 90, 87]] • Disadvantages: • Looking at the list, cannot tell what the “fields” mean. (What is the 1th item?) • List has order, which we don’t need.
One fix: use functions • We could create functions to extract and name the data: defgetName(stud): return stud[0] defgetYear(stud): return stud[1] defgetLowestGrade(stud): # code here to iterate through stud[2] # assume we’ve created student1 and student2, both lists# with the proper format.name = getName(student1) year = getYear(student2) if getLowestGrade(student1) > getLowestGrade(student2): print(“Good job, student!”)
Thoughts on this… • It is a big improvement, but… • Change the order of the data in the list you have to change the function code. • What is stud[1]? The code in the functions is still unreadable. (First grade is stud[2][0].) • You cannot enforce that users of this list will use the provided functions to get the values. • First parameter to every function is the student data structure.
Better: classes and objects • a class is like a recipe (or template). • you don't eat the recipe, right? • an object(or instance) is an instantiation of that class • that's what you eat. • Each class is defined by its • name • attributes (characteristics, properties, fields) • methods (functions) • We already know how to define functions, but we don’t know how to group them together, to say, “These belong together, and they operate on this data.”
Examples • list is a built-in python class (or type). • holds ordered objects. • has methods defined: append(), extend(), index(), [], [x:y], +, pop(), etc. • Instantiate it as often as you want to make individual objects. girls = [‘Kim’, ‘Taylor’, ‘Beyonce’] guys = [‘Stone’, ‘Rock’, ‘Lance’]
Attributes and Methods • Attribute: a “field” in an object. • A.k.a. a characteristic, property, or an instance variable. • a “noun”: something an object “has”. • Method: Operation/function you ask an object to do to itself. • it is a verb.
Question Which of the following is not a good attribute name of a Car? • numWheels • accelerate • color • year • manufacturer
Q2 Which of the following is not a good method name of a Person class? • hairColor • speak • climbStairs • walk • jump
Syntax to do all this • Need to define the class… • name • attributes of an object • methods that can be called to operate on the object.
Syntax of class definition class Student: # use Capital Letter “””A class that represents a Student.””” def __init__(self, name, year, grades): “””Constructor to make a new students instance (object).””” self.myName = name self.myYear = year self.myGrades = grades student1 = Student( “Dan”, 4, [80, 82, 6] ) First, define how to create an instance of a Student class. Assign given parameter values to attributes in new object. self is the new instance (object) being created and initialized
self • Note that there is code “on the inside” – code inside the class definition. • Code in __init__, getName(), etc. • This code refers to the object as self. • Then, there is code on the outside: stud1 = Student( “Dan”, 4, [100, 90, 80] ) • This code refers to the object as stud1.
Differences from using a list • fields have clear names! • self.name is the student’s name, instead of stud[0]. • fields are not stored in any order: just “owned” by the object.
cs104Student.click() How many syntax errors are there in this code?: class Car def _init_(make, model, year): self.myMake = make self.myModel = model myYear = year
cs104Student.clickAgain() Given this class definition: class Car: def __init__(self, make, model, year): self.myMake = make self.myModel = model self.myYear= year which is legal code to make a new Car instance? • aCar = Car.__init__(self, “Honda”, “Odyssey”, 2001) • aCar = Car.__init__("Honda", "Odyssey", 2001) • aCar = Car("Honda", "Odyssey", 2001) • aCar = Car(self, "Honda", "Odyssey", 2001) • Car(aCar, "Honda", "Odyssey", 2001)
getters/accessors and setters/mutators • First methods typically written are to allow code that uses the class to access/change the attributes: • If you define attribute xyz, you create: defgetXyz(self): “”“return the xyz value for this object””” return self.xyz defsetXyz(self, newXyz): “””set the attribute xyz to the new value””” self.xyz = newXyz
Example class Student: def__init__(self, name, year, grades): self.myName= name self.myYear = year defgetName(self): return self.myName defsetName(self, newName): self.myName = newName defgetYear(self): return self.myYear defsetYear(self, newYear): self.myYear = newYear # Create a student student1 = Student( “Angelina”, 10, [] )
Example Continued # Old Code: name = getName(student1) year = getYear(student2) if getLowestGrade(student1) > getLowestGrade(student2): print “Good job, student!” # Now: name = student1.getName() year = student2.getYear() if student1.getLowestGrade() > student2.getLowestGrade(): print “Good job, student!” self “inside” the code
If there is time… • List 8 properties you might want to store about a Car. List the type of each property. • Write the first line of the class definition, and the constructor. The constructor initializes attributes to given values. • Write a getter method for each of 2 attributes. • Write a setter method for 2 attributes that can be changed.