230 likes | 238 Views
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
E N D
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.