前言

Python 的魔法方法是指 Python 内部已经包含的, 被双下划线所包围的方法, 这些方法在特定的操作时会自动被调用。
魔法方法可以使 Python 的自由度变得更高,当不重载魔法方法时它可以在规定的默认情况下生效,也可以根据自己的需求来重载分魔法方法来达到自己的目的。

__call__()

__call__(self,[*args]) 允许一个类实例对象能像函数那样被调用。在介绍__call__之前,我们来先来介绍一个概念, 可调用对象:
在 Python 中, 凡是可以将 () 直接应用到自身并执行,都可以称为 可调用对象,它包括 自定义函数, 内置函数,类。
判断一个对象是否是可调用对象,我们可以用 Python 内置的函数callable(), 如我们定义了类str_cls,我们可以用它来判断是否是个可调用对象:

class str_cls():
… pass … >>> callable(str_cls)
True # 对实例对象 a 做判断

a = str_cls()>>> callable(a)
False

可以看到, 类是可调用对象, 实例对象不是可调用对象, 而一旦在类内部实现了 __call__ 方法,那么该类创建的实例对象也将称为一个可调用对象, 看下面示例:

class Animal():
… def init(self,name,age):
… self.name = name
… self.age = age
… def call(self,food):
… print(“my name is %s,i’m %d old” %(self.name,self.age))
… print(‘i eat %s’ % food)
… >>> dog = Animal(‘dog’,12) >>> callable(Animal)
True >>> callable(dog)
True >>> dog(‘milk’)
my name is dog,i’m 12 old
i eat milk

可以看到,我们在类Animal中实现了__call__方法,实例对象dog也是可调用对象,并且 dog('milk') 实际上是调用了__call__(self,food)方法.
如果没有实现__call__方法,那么去调用dog('milk'), 会抛出异常提示 Animal 实例对象是不可调用的: TypeError: 'Animal' object is not callable
https://www.cnblogs.com/techfix/p/12493855.html