A Guide to Python's __init__ Method

A foundational guide to the __init__ method in Python classes. Learn how this special method acts as the constructor to initialize the state of a new object.

When you start creating your own objects in Python using the class keyword, one of the first special methods you will encounter is __init__(). This method is fundamental to object-oriented programming in Python.

The __init__ method is the constructor for a class. It is called automatically by Python every time you create a new instance of that class. Its primary job is to initialize the attributes of the object, setting up its initial state.

Why is it called __init__?

The name is short for "initialize." The double underscores on each side (which makes it a "dunder" method) signify that this is a special method that Python uses for its own purposes. You don't call __init__ directly; Python calls it for you when you create an object.

A Simple Class without __init__

Let's start with a class that doesn't have an __init__ method.

class Dog:
    def bark(self):
        print("Woof!")

my_dog = Dog() # Create an instance
my_dog.bark()

This is fine, but our Dog object has no data associated with it. It has no name or age.

Adding __init__ to Initialize State

Let's add an __init__ method to our Dog class to store the name and age of each dog we create.

class Dog:
    # This is the constructor
    def __init__(self, name, age):
        print("A new dog object is being created!")
        # Assign the arguments to instance attributes
        self.name = name
        self.age = age

    def describe(self):
        print(f"{self.name} is {self.age} years old.")

Understanding self

The self parameter is the first parameter of every instance method in a class, including __init__. It represents the instance of the object itself.

When you create a new Dog object like this:

my_dog = Dog("Fido", 4)

Python does two things behind the scenes:

  1. It creates a new, empty Dog object.
  2. It calls the __init__ method, passing this new object in as the self argument, along with any other arguments you provided ("Fido" and 4).

Inside __init__, the line self.name = name creates an instance attribute called name on the my_dog object and assigns it the value "Fido".

Creating Instances with __init__

Now that our class has an __init__ method, we must provide the required arguments when we create an instance.

dog1 = Dog("Fido", 4)
dog2 = Dog("Lucy", 2)

dog1.describe() # Output: Fido is 4 years old.
dog2.describe() # Output: Lucy is 2 years old.

Each Dog object is a separate instance with its own name and age attributes, set up by the __init__ method when the object was created.

Default Values

You can also provide default values for your arguments in __init__, just like with any other Python function.

class Dog:
    def __init__(self, name, age=0):
        self.name = name
        self.age = age

Now, age is an optional parameter:

puppy = Dog("Buddy") # age will default to 0

Conclusion

The __init__ method is the standard and idiomatic way to set the initial state of an object in Python. It acts as the constructor for your class, allowing you to pass in required data when an object is created and assign that data to the instance's attributes. A solid understanding of __init__ and the self parameter is the key to unlocking the power of object-oriented programming in Python.