View Discussion
Improve Article
Save Article
View Discussion
Improve Article
Save Article
Python has a set of built-in methods and __call__
is one of them. The __call__
method enables Python programmers to write classes where the instances
behave like functions and can be called like a function. When the instance is called as a function; if this method is defined, x[arg1, arg2, ...]
is a shorthand for x.__call__[arg1, arg2, ...]
.
object[] is shorthand for object.__call__[]
Example 1:
class
Example:
def
__init__[
self
]:
print
[
"Instance Created"
]
def
__call__[
self
]:
print
[
"Instance is called via special method"
]
e
=
Example[]
e[]
Output :
Instance Created Instance is called via special method
Example 2:
class
Product:
def
__init__[
self
]:
print
[
"Instance Created"
]
def
__call__[
self
, a, b]:
print
[a
*
b]
ans
=
Product[]
ans[
10
,
20
]
Output :
Instance Created 200
View Discussion
Improve Article
Save Article
View Discussion
Improve Article
Save Article
Dunder or magic methods in Python are the methods having two prefixes and suffix underscores in the method name. Dunder here means “Double Under
[Underscores]”. These are commonly used for operator overloading. Few examples for magic methods are: __init__, __add__, __len__, __repr__
etc. In this article, we are going to see the difference between two such methods.
Note: For more information, refer to Dunder or magic methods in Python
__init__[]
This Python method is similar to a constructor in any other programming language. A
constructor is a definition with the same name as the class and is invoked automatically when the object of that class is defined. A constructor initializes all the required entities of the program to make it more reliable.
Similar to this definition __init__[] works as a Python constructor it is invoked automatically when an object of the class is defined. It initializes the required members with default values provided. It can also be invoked with the values provided during the time of
declaration of the object of the class.
EXAMPLE:
class
A:
def
__init__[
self
, x]:
print
[
"inside __init__[]"
]
self
.y
=
x
def
__str__[
self
]:
print
[
"inside __str__[]"
]
print
[
"value of y:"
,
str
[
self
.y]]
a
=
A[
3
]
a.__str__[]
b
=
A[
10
]
b.__str__[]
OUTPUT:
inside __init__[] inside __str__[] ['value of y:', '3'] inside __init__[] inside __str__[] ['value of y:', '10']
__call__[]
Before getting into application of __call__[]
we need to understand what a callable object is.
A callable object is one which can be called like a function.
In Python, __call__[] is used to resolve the code associated with a callable object. Any object can be converted to a callable object just by writing it in a function call format. An object of that kind
invokes the __call__[] method and executes the code associated with it. This doesn’t make the object not to work like a normal one. The object can be used as a normal is used.
One thing to keep in mind is the object is itself used as a function, so syntax should be right.
EXAMPLE:
class
A:
def
__init__[
self
, x]:
print
[
"inside __init__[]"
]
self
.y
=
x
def
__str__[
self
]:
print
[
"inside __str__[]"
]
print
[
"value of y:"
,
str
[
self
.y]]
def
__call__[
self
]:
res
=
0
print
[
"inside __call__[]"
]
print
[
"adding 2 to the value of y"
]
res
=
self
.y
+
2
return
res
a
=
A[
3
]
a.__str__[]
r
=
a[]
print
[r]
b
=
A[
10
]
b.__str__[]
r
=
b[]
print
[r]
OUTPUT:
inside __init__[] inside __str__[] ['value of y:', '3'] inside __call__[] adding 2 to the value of y 5 inside __init__[] inside __str__[] ['value of y:', '10'] inside __call__[] adding 2 to the value of y 12
Difference between __init__[] VS __call__[]
Same as a constructor, it initializes the values | It is used for a direct call using the object |
It is invoked automatically when an object is declared | It is invoked automatically by a callable |
Called by an regular object | Called by a callable object |
Example: a=A[3] #statement 1 a[] #statement 2 __init__[] is called by statement 1 | Example: a=A[3] #statement 1 a[] #statement 2 __call__[] is called by statement 2 |