Altcademy - a Forbes magazine logo Best Coding Bootcamp 2023

What is self in Python

Understanding self in Python

When you're starting to learn programming in Python, you might come across the term self quite frequently, especially when dealing with classes and objects. It may seem a bit confusing at first, but with a few examples and analogies, you'll find that it's a concept that you can grasp more easily than you might expect.

What Does self Represent?

Imagine you're in a room full of people, and someone says, "I am hungry." Without thinking about it, you understand that the person speaking is referring to themselves. In Python, self serves a similar purpose; it refers to the object itself.

In Python, self is a reference to the instance of the class. When you create a new instance of a class, self points to that newly created object. It's not a keyword in Python but rather a strong convention. Programmers use self as the first parameter in instance methods within a class.

Why Do We Need self?

You might wonder why there's a need for self when calling methods in Python. To illustrate, let's use a simple example. Suppose we have a class called Person, and we want to create a method that prints out the name of the person.

class Person:
    def __init__(self, name):
        self.name = name

    def say_hello(self):
        print(f"Hello, my name is {self.name}!")

Here, __init__ is what's known as a constructor in Python. It's a special method that gets called when you create a new instance of a class. Inside this method, self.name = name assigns the value passed to the constructor to the name attribute of the object.

When you call say_hello, you don't need to pass any arguments because self is implicitly passed. self.name inside the say_hello method refers to the name attribute of the specific instance that called the method.

How Does self Work?

To understand how self works, let's create an instance of our Person class.

person1 = Person("Alice")
person1.say_hello()  # Output: Hello, my name is Alice!

When person1.say_hello() is called, Python internally converts it to Person.say_hello(person1). That's why the method definition has self as its first parameter; it's a placeholder for the instance.

self Is Not a Keyword

It's important to note that self is not a keyword in Python, which means you could technically name it anything you like. However, using self is a convention that improves code readability and is strongly recommended to follow.

Let's see what happens if we don't follow this convention:

class Person:
    def __init__(my_object, name):
        my_object.name = name

    def say_hello(my_object):
        print(f"Hello, my name is {my_object.name}!")

This code will work exactly the same way, but it's not immediately clear to someone reading it that my_object refers to the instance of the class. This is why sticking to self is a good idea.

Methods Without self

Not all methods within a Python class need to have self as a parameter. These are called static methods and are marked with the @staticmethod decorator. They don't access the instance (self) or the class itself (cls which is used in class methods, marked with @classmethod). They are bound to the class, not the object, and are the same for all instances of the class.

class MathOperations:
    @staticmethod
    def add_numbers(x, y):
        return x + y

In this case, add_numbers doesn't need access to any properties of the class or its instances, so it doesn't require self.

Intuition Behind self

Let's use an analogy to further understand self. Think of a class as a blueprint for a house. Each house built from that blueprint is an instance of that class. The blueprint defines where the rooms and doors should be, just like a class defines the methods and attributes.

When you want to paint the door of a specific house, you don't paint the blueprint; you paint the actual door of the house. Similarly, when you want to modify or access the attributes of an instance, you use self to refer to that specific object.

Conclusion

In essence, self in Python is a way to refer to the instance from which a method is being called. It's like a mirror that reflects the object itself, allowing you to access its attributes and methods. While self is not a reserved keyword, it's a convention that has been embraced by the Python community for its clarity and readability.

As a beginner, understanding self might take a little time, but it's a fundamental concept that will become second nature as you work more with classes and objects. Just remember, self is the object's way of saying "me" to itself. It's the object's selfie, if you will, a snapshot of its own state and behavior.

By sticking to this convention and practicing writing classes and methods, you'll soon be able to navigate the world of object-oriented programming in Python with confidence. Happy coding!