Slides

advertisement
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:
def getName(stud):
return stud[0]
def getYear(stud):
return stud[1]
def getLowestGrade(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?
A. numWheels
B. accelerate
C. color
D. year
E. manufacturer
Q2
Which of the following is not a good method
name of a Person class?
A. hairColor
B. speak
C. climbStairs
D. walk
E. 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).”””
First, define how to create an
self.myName = name
instance of a Student class.
self.myYear = year
Assign given parameter
self.myGrades = grades
values to attributes in new
self is the new instance
(object) being created and
initialized
object.
student1 = Student( “Dan”, 4, [80, 82, 6] )
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?
A. aCar = Car.__init__(self, “Honda”, “Odyssey”,
2001)
B. aCar = Car.__init__("Honda", "Odyssey", 2001)
C. aCar = Car("Honda", "Odyssey", 2001)
D. aCar = Car(self, "Honda", "Odyssey", 2001)
E. 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:
def getXyz(self):
“”“return the xyz value for this object”””
return self.xyz
def setXyz(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
def getName(self):
return self.myName
def setName(self, newName):
self.myName = newName
def getYear(self):
return self.myYear
def setYear(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.
Download