Fundamentals 4 min read

Understanding Python __call__ and __init__ Magic Methods and Their Use in Class Decorators

This article explains the differences between Python's __init__ and __call__ magic methods, demonstrates their behavior with example code, and shows how __call__ can be used to implement class decorators for callable objects.

IT Services Circle
IT Services Circle
IT Services Circle
Understanding Python __call__ and __init__ Magic Methods and Their Use in Class Decorators

In this article, the author explains the difference between Python's __init__ and __call__ magic methods, demonstrates their behavior with example code, and shows a practical use case of __call__ in implementing class decorators.

First, a simple class Person is defined with both __init__ and __call__ methods; creating an instance prints "init" once, while calling the instance repeatedly prints "call". The output illustrates that __init__ runs only during object construction, whereas __call__ enables the instance to be invoked like a function.

class Person:
    def __init__(self):
        print("init")
    def __call__(self):
        print("call")

m1 = Person()
m1()
m1()
m1()

The printed result is:

init
call
call
call

The article then lists the key distinctions: __init__ is the constructor called once per instance, and __call__ makes the object callable, allowing custom behavior on each call. Attempting to call an object without __call__ raises a TypeError:

TypeError: 'Person' object is not callable

Finally, a class decorator example is presented: a MyDecorator class defines __init__ to store a function and __call__ to execute it, printing messages before and after. Applying @MyDecorator to a function hello shows how the decorator runs its __init__ once and __call__ on each function invocation.

class MyDecorator(object):
    def __init__(self, f):
        self.f = f
        print("__init__()...")
    def __call__(self):
        print("__call__()...")
        self.f()

@MyDecorator
def hello():
    print("hello...")

hello()
hello()
hello()

The printed result is:

__init__()...
__call__()...
hello...
__call__()...
hello...
__call__()...
hello...

The author invites readers to share feedback and suggests that more detailed topics like class decorators could be covered in future posts.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

object‑oriented programminginitmagic methods__call__class decorator
IT Services Circle
Written by

IT Services Circle

Delivering cutting-edge internet insights and practical learning resources. We're a passionate and principled IT media platform.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.