We’ll now look at a special Python function that is part of most classes: the Python constructor. A constructor is a function that is called automatically when an object is created. A constructor can optionally accept arguments as well, just like a regular function.
The default constructor
When creating an object from a class, it looks like we are calling a function:
car = Car()
Code language: Python (python)
Well… it doesn’t just look like we are calling a function, we are in fact calling a function! This method, which we did not have to define, is called the constructor. It constructs and initializes the object. Every class has one by default, called __init__
, even if we don’t define it ourselves. This has to do with inheritance, which you’ll learn about shortly.
Have you ever used the str()
function to convert a number into a string? Or perhaps the int()
function to convert a string into a number?
>>> 'a' + str(1)
'a1'
>>> int('2') + 2
4
Code language: Python (python)
What you are doing here, is creating new objects of type str
and int
by calling the constructors of the classes str
and int
.
Creating your own Python constructor
We can override the __init__
method, to give it extra abilities by accepting arguments. Let’s redefine the Car
class using a custom constructor:
class Car:
def __init__(self, started = False, speed = 0):
self.started = started
self.speed = speed
def start(self):
self.started = True
print("Car started, let's ride!")
def increase_speed(self, delta):
if self.started:
self.speed = self.speed + delta
print("Vrooooom!")
else:
print("You need to start the car first")
def stop(self):
self.speed = 0
Code language: Python (python)
Our custom Python constructor has named parameters with default values, so we can create instances of the class Car
in multiple ways:
>>> c1 = Car()
>>> c2 = Car(True)
>>> c3 = Car(True, 50)
>>> c4 = Car(started=True, speed=40)
Code language: Python (python)
You may have noticed a flaw: we can now create a new car that is not started but set its speed anyway. For now, let’s leave it at that.