4 Classes Objects
4 Classes Objects
Example class:
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
Class Definition
5
Attribute references use standard syntax.
In the example class:
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
◦ Class attributes, like MyClass.i, can have their values changed by assignment.
◦ __doc__ is also a valid attribute that will return the docstring belonging to the
class.
In the example class:
“A simple example class”
Class Objects
6
Class instantiation uses function notation.
◦ As if the class object is a parameterless function that returns a new instance of the
class
◦ This creates a new instance of the class and assigns this object to the local variable x.
◦ Instantiation creates an empty object, so many classes like to define special methods
that create objects with instances customized to a specific initial state.
def __init__(self):
self.data = []
There are two kinds of valid attribute names, data attributes and
methods.
x.counter = 1
while x.counter < 10:
x.counter = x.counter * 2
print x.counter
del x.counter
Instance Objects
9
The other kind of instance attribute reference is a method. A
method is a function that “belongs to” an object. Valid method
names of an instance object depend on its class.
In the example, the following will return the string hello
world.
x.f()
Method Object
11
Python, like most other languages, has inheritance, as well as multiple
inheritance.
class DerivedClassName(BaseClassName):
<statement-1>
.
.
.
<statement-N>
Inheritance
12
A class definition with multiple base classes looks like this
class DerivedClassName(Base1,Base2,Base3):
<statement-1>
.
.
.
<statement-N>
Inheritance cont.
13
“Private” instance variables that cannot be accessed except
from inside an object don’t exist in Python.
Private Variables
14
• User-defined exceptions are indentified by classes as
well.
• It is also possible to create extensible hierarchies of
exceptions.
raise instance
Exceptions
15
You can define an __iter__() method which returns an object with a next().
When there are no more elements, next() raises a StopIteration which tells the for
loop to terminate.
An example would be:
class Reverse:
"Iterator for looping over a sequence backwards"
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def next(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
>>> for char in Reverse('spam'):
...print char
...
m
a
p
s
Iterators
16
Written like regular functions, but use the yield statement
whenever they want to return data.
Generators
17
• You can use generator expressions, instead of writing a full
generator definition to quickly create a simple generator.
Some examples:
>>> sum(i*i for i in range(10)) # sum of squares
285
Generator Expressions
18
OOP, Defining a Class
• Python was built as a procedural language
– OOP exists and works fine, but feels a bit more "tacked on"
– Java probably does classes better than Python (gasp)
• Declaring a class:
class name:
statements
19
Fields
name = value
– Example: point.py
class Point: 1 class Point:
x = 0 2 x = 0
y = 0 3 y = 0
# main
p1 = Point()
p1.x = 2
p1.y = -5
20
Using a Class
import class
– client programs must import the classes they use
point_main.py
1 from Point import *
2
3 # main
4 p1 = Point()
5 p1.x = 7
6 p1.y = -3
7 ...
8
9 # Python objects are dynamic (can add fields any time!)
10 p1.name = "Tyler Durden"
21
Object Methods
def name(self, parameter, ..., parameter):
statements
22
"Implicit" Parameter (self)
• Java: this, implicit
public void translate(int dx, int dy) {
x += dx; // this.x += dx;
y += dy; // this.y += dy;
}
23
Exercise Answer
point.py
1 from math import *
2
3 class Point:
4 x = 0
5 y = 0
6
7 def set_location(self, x, y):
8 self.x = x
9 self.y = y
10
11 def distance_from_origin(self):
12 return sqrt(self.x * self.x + self.y * self.y)
13
14 def distance(self, other):
15 dx = self.x - other.x
16 dy = self.y - other.y
17 return sqrt(dx * dx + dy * dy)
24
Calling Methods
• A client can call the methods of an object in two ways:
– (the value of self can be an implicit or explicit parameter)
1) object.method(parameters)
or
2) Class.method(object, parameters)
• Example:
p = Point(3, -4)
p.translate(1, 5)
Point.translate(p, 1, 5)
25
Constructors
def __init__(self, parameter, ..., parameter):
statements
– Example:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
...
26
toString and __str__
def __str__(self):
return string
– equivalent to Java's toString (converts object to a string)
– invoked automatically when str or print is called
27
Complete Point Class
point.py
1 from math import *
2
3 class Point:
4 def __init__(self, x, y):
5 self.x = x
6 self.y = y
7
8 def distance_from_origin(self):
9 return sqrt(self.x * self.x + self.y * self.y)
10
11 def distance(self, other):
12 dx = self.x - other.x
13 dy = self.y - other.y
14 return sqrt(dx * dx + dy * dy)
15
16 def translate(self, dx, dy):
17 self.x += dx
18 self.y += dy
19
20 def __str__(self):
21 return "(" + str(self.x) + ", " + str(self.y) + ")"
28
Operator Overloading
• operator overloading: You can define functions so that
Python's built-in operators can be used with your class.
• See also: http://docs.python.org/ref/customization.html
29
Exercise
• Exercise: Write a Fraction class to represent rational
numbers like 1/2 and -3/8.
30
Generating Exceptions
raise ExceptionType("message")
– Example:
class BankAccount:
...
def deposit(self, amount):
if amount < 0:
raise ValueError("negative amount")
...
31
Inheritance
class name(superclass):
statements
– Example:
class Point3D(Point): # Point3D extends Point
z = 0
...
32
Calling Superclass Methods
• methods: class.method(object,
parameters)
• constructors: class.__init__(parameters)
class Point3D(Point):
z = 0
def __init__(self, x, y, z):
Point.__init__(self, x, y)
self.z = z
33