Magic Methods

__init__ - Constructor

Called when an object is created.

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

p = Person("Alice")

__str__ – String Representation

Called when you use print(obj).

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

    def __str__(self):
        return f"My name is {self.name}"

print(Person("Alice"))  # My name is Alice

__repr__ – Official String Representation

Used in debugging and repr(obj).

def __repr__(self):
    return f"Person('{self.name}')"

__len__ – Length

Called by len(obj).

class MyList:
    def __init__(self, data):
        self.data = data

    def __len__(self):
        return len(self.data)

obj = MyList([1, 2, 3])
print(len(obj))  # 3

__getitem__, __setitem__ – Indexing

class MyList:
    def __init__(self, data):
        self.data = data

    def __getitem__(self, index):
        return self.data[index]

    def __setitem__(self, index, value):
        self.data[index] = value

__add__, __sub__, __mul__, etc. – Operator Overloading

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def __str__(self):
        return f"({self.x}, {self.y})"

v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2)  # (4, 6)

__eq__, __lt__, etc. – Comparisons

class Item:
    def __init__(self, price):
        self.price = price

    def __eq__(self, other):
        return self.price == other.price

i1 = Item(100)
i2 = Item(100)
print(i1 == i2)  # True

__call__ – Make an object callable

class Greeter:
    def __call__(self, name):
        return f"Hello, {name}!"

greet = Greeter()
print(greet("Alice"))  # Hello, Alice!

__enter__ / __exit__ – Context Managers (with statement)

class MyContext:
    def __enter__(self):
        print("Entering...")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("Exiting...")

with MyContext():
    print("Inside block")

Output:

Entering...
Inside block
Exiting...

📜 Summary Table

Magic Method
Triggered By

__init__

Object creation

__str__

print(obj)

__repr__

repr(obj)

__len__

len(obj)

__getitem__

obj[key]

__setitem__

obj[key] = value

__add__

obj1 + obj2

__eq__, etc.

Comparisons ==, <, etc.

__call__

obj()

__enter__/__exit__

with block

Last updated