Methods defined within a Python class, such as the __init__ method or other custom methods, typically include self as their first parameter. What exactly is this self, and why is it there?
Think back to creating objects (instances) from a class. You might create several objects from the same class blueprint, each with its own set of attribute values. For example:
class Dog:
def __init__(self, name, breed):
# Assigning values to THIS specific dog's attributes
self.name = name
self.breed = breed
def describe(self):
# Using THIS specific dog's name and breed
print(f"This dog is named {self.name} and is a {self.breed}.")
# Create two different Dog objects
dog1 = Dog("Buddy", "Golden Retriever")
dog2 = Dog("Lucy", "Poodle")
Now, suppose you call the describe method on one of these objects:
dog1.describe()
# Output: This dog is named Buddy and is a Golden Retriever.
dog2.describe()
# Output: This dog is named Lucy and is a Poodle.
When dog1.describe() is called, how does the describe method know it should use "Buddy" for the name and "Golden Retriever" for the breed? Similarly, how does it know to use "Lucy" and "Poodle" when dog2.describe() is called?
This is where self comes in. When you call a method on an object like my_object.my_method(arg1, arg2), Python automatically passes the object itself (my_object in this case) as the first argument to the method. By convention, this first parameter in the method definition is named self.
So, inside the describe method definition:
def describe(self):
print(f"This dog is named {self.name} and is a {self.breed}.")
self acts as a reference to the specific instance (the object) on which the method was called.
dog1.describe() runs, self refers to the dog1 object. Therefore, self.name accesses dog1.name ("Buddy") and self.breed accesses dog1.breed ("Golden Retriever").dog2.describe() runs, self refers to the dog2 object. Therefore, self.name accesses dog2.name ("Lucy") and self.breed accesses dog2.breed ("Poodle").Essentially, self allows the method's code to access the attributes and other methods belonging to the particular object instance it's working with. You use self.attribute_name to get the value of an attribute for that specific object, or self.method_name() to call another method on that same object.
Why the name self?
While self is not a reserved keyword in Python (like def, class, or if), it is a deeply ingrained convention. You could technically name this first parameter something else, like this_object or instance:
# Technically works, but NOT recommended
class Cat:
def __init__(this_cat, name):
this_cat.name = name # Using 'this_cat' instead of 'self'
def meow(this_cat):
print(f"{this_cat.name} says Meow!") # Using 'this_cat' again
my_cat = Cat("Whiskers")
my_cat.meow()
# Output: Whiskers says Meow!
However, using any name other than self is strongly discouraged. Sticking to the self convention makes your code instantly recognizable and understandable to other Python developers (and to your future self!). It's a standard practice you should always follow when defining instance methods.
In summary, self is the conventional name for the first parameter of instance methods in Python classes. It represents the instance (the object) itself, allowing methods to access the object's specific attributes and call its other methods. Python automatically passes the instance as this first argument whenever you call a method on an object.
Was this section helpful?
self is demonstrated.self. 5th edition.© 2026 ApX Machine LearningEngineered with