前言
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