Python classes#
If you’ve not used Python classes before, this guide will give you an introduction to what they are and what they are used for.
In general, a class
is a set of instructions for how to create an object. An instance of a class is the object that is created from the class.
As an example, we can create a class that defines a fraction.
from math import gcd
class Fraction:
"""A fraction."""
def __init__(self, numerator, denominator):
self.numerator = numerator
self.denominator = denominator
def print_numerator(self):
print(self.numerator)
def __str__(self):
"""Get string representation."""
return str(self.numerator) + " over " + str(self.denominator)
def __add__(self, other):
"""Add two fractions."""
assert isinstance(other, Fraction)
new_numerator = self.numerator * other.denominator + other.numerator * self.denominator
new_denominator = self.denominator * other.denominator
common_factor = gcd(new_numerator, new_denominator)
return Fraction(new_numerator // common_factor, new_denominator // common_factor)
def __mul__(self, other):
"""Multiply two fractions."""
assert isinstance(other, Fraction)
new_numerator = self.numerator * other.numerator
new_denominator = self.denominator * other.denominator
common_factor = gcd(new_numerator, new_denominator)
return Fraction(new_numerator // common_factor, new_denominator // common_factor)
This class contains a number of functions: functions inside a class are called methods.
Each method starts with the self
input: this refers to the instance of the class itself and can be used to store information
that other methods will need. (You could use another name instead of self
but it’s very very common practice to use self
.)
Function that start and end with a double underscore (__
) are special methods.
The special method __init__
is run when an instance of the class is created. In this function, we store the numerator and denominator of the
fraction as self.numerator
and self.denominator
.
We can create a fraction and call the print_numerator
method like this:
half = Fraction(1, 2)
half.print_numerator()
This first line will run __init__
with half
as self
, 1
as numerator
and 2
as denominator
. The second line will run print_numerator
with half
as self
, and will therefore
print 1
.
The special method __str__
defines what happens when you print
an instance of your class. In our example, print(half)
will print 1 over 2
.
The special method __add__
defines what the +
operator does. If you read the implementation above, you can see that __add__
is adding fractions in the way you would expect. For example, you can add two fractions like this:
half = Fraction(1, 2)
third = Fraction(1, 3)
print(half + third)
The special method __mul__
defines what the *
operator does. For example, you can multiply two fractions like this:
half = Fraction(1, 2)
third = Fraction(1, 3)
print(half * third)
There are a lot more special methods that you can use, including those to define the behaviour of -
, /
, //
, **
, @
, []
, =
, <
, <=
, >
, and >=
. You can find
(details of these in the Python documentation](https://docs.python.org/3/reference/datamodel.html#specialnames)