Slides

advertisement
Section 6.1
CS 106
Victor Norman
IQ Unknown
The Big Q
What do we get by being able to
define a class?!
Or
Do we really need this?!
Ancient History (last Tuesday)
• 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 numbervia
card[1].
• What is good and what is bad about this
implementation?
What types of variables can we make?
• Is this good enough?
Second big Q
What defines a type?
• Data + operations
– what you can store.
– what you can do to or with it.
Lecture...
• a class definition is like a recipe (or template).
– you don't eat the recipe, right?
• an object is an instantiation of that class
– that's what you eat.
• Or, a class is a new type.
Class (or Type)
• Marriage of data and methods.
• Boundary between caller and implementer
– perspective on the world.
• self is a
reference to the object, from within
the class code.
• Each object has its own namespace, accessible
via self. (In fact, isn't an object just a
namespace? Could be...)
Creating class instances
Q: One creates a new instance of a class by
calling the class ______________.
A: constructor
What does constructor code do?
Q: When code instantiates a class, the __init__
method is called. This method's "primary
purpose is to establish initial values for the
____________ of the newly created object."
A: attributes
Code for Car constructor
Q: I have a class Car that I instantiate this way:
car = Car()
Write the method definition for Car’s constructor.
A:
def __init__(self):
# code here to initialize attributes to
# default values …
self._color = “black”
“Setter” Signature
Q: After creating a Car instance (i.e., object), my
main code wants to set the Car's color to a new
color. Write the signature of the Car member
function, setColor(), to set the car's color.
A:
def setColor(self, color):
‘’’set the color of this car to the given
color’’’
self._color = color
“Getter” Signature
Q: Then, my main code wants to get the color
from my car instance. Write the signature for
the member function getColor().
A:
def getColor(self):
‘’’return the color of this Car to the
caller.’’’
return self._color
# my color
Syntax errors?
How many syntax errors are there in this code?:
class Car
def _init_(make, model, year):
self.myMake = make
self.myModel = model
myYear = year
Answer me this.
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)
Why use classes?
What are the advantages/disadvantages of defining a
class/type?
Advantages:
• Can control the state of each object
– the setter methods allow only some attributes to be changed.
– Sets up a sort-of “firewall” around each object.
• Can control what a user can do with an object.
• Is more “polite”: code “asks” an object to do something for
it.
• Other advantages: subclassing, etc.
Disadvantages:
• More syntax. More code.
Accessors and no mutators?
Q: What would be the advantage to only giving
the user accessor functions and no mutator
functions?
A: You can restrict what attributes can be
changed – i.e., you can make them
immutable
Example
class Student:
def __init__(self, name, id, grades):
self._name = name
self._id = id
self._grades = grades
def setName(self, newName):
“””Change the student’s name”””
self._name = newName
# getName(), getId(), and getGrades() here.
# No setId() here: a student’s id can never
# be changed after the object has been created.
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”, 1040471, [100, 90, 80]
)
• This code refers to the object as stud1.
Example
class Student:
def __init__(self, name, id, grades):
self._name = name
self._id = id
self._grades = grades
def getName(self):
return self._name
def setName(self, newName):
self._name = newName
def getId(self):
return self._id
# Create a student
student1 = Student( “Angelina”, 10, [] )
Designing a Class
When you design a class, you decide:
• what are the important properties (or attributes,
characteristics, or state) of an instance.
• what information a caller should be able to get
from an object
• what state a caller should be able to change in an
object
• what a caller should be able to ask an object to
do to itself.
What goes in a class definition?
Q: So it is my understanding that a class
definition is a series of function definitions
nested within the class definition… Is there
anything else that goes into it?
A: No. The function definitions in the class
definition define the operations that the objects
provide. The attributes for each object are set in
the constructor method.
Naming Conventions
• A class name always starts with a capital letter.
Each word in the class starts with a capital
letter.
– class MyFathersCar:
– class Cs106Lab:
• A class attribute always starts with an
underscore: _
– self._x_loc, self._y_loc, self._color
Naming Conventions
• local variables must start with a lowercase letter.
• global variables must also start with a lowercase
letter, unless they are CONSTANTS, which must be
all uppercase.
• function names start with a lowercase letter.
• Either use camelCase for function names and
variables or use _'s between words in a name.
– myXLocation, or, my_x_location
– getLocation(), or, get_location()
Order of methods in a class
Q: Does the order the methods are defined in a
class matter?
A: No. By convention the constructor method is
always first, however.
Attribute names
Q: Why would the coder choose _x and _y
instead of x and y?
A: It is a convention to name your attributes
with names starting with _. The reader of the
code can then know what something is when it
sees the _ in front of the name.
Download