![ea1a614db8b71924627810ea456515e0.png](https://img-blog.csdnimg.cn/img_convert/ea1a614db8b71924627810ea456515e0.png)
Python中的函数其实也是对象,且都是可调用对象。而通过为类定义__call__()方法我们也可以将自定义的Python类定制为可调用对象。
使用示例
![54623acbfb051037460ed7594efe0d08.png](https://img-blog.csdnimg.cn/img_convert/54623acbfb051037460ed7594efe0d08.png)
我们可以看到,对象实例w的两种等价调用方式分别是w.__call__(x)和w(x),前者为普通的调用类方法的方式,后者为Python中的语法糖实现了将对象变为可调用的目的。
另外明显对于无名的临时对象也是可调用对象:
![444ecbe4e5121b4302070c4d6322d9bb.png](https://img-blog.csdnimg.cn/img_convert/444ecbe4e5121b4302070c4d6322d9bb.png)
类可调用的与对象可调用的不同
要注意类都是可调用的,而对象可通过__call__()函数来设计为可调用或者不可调用。如下代码
![e960ee95006b68e187a09fd83afa6d50.png](https://img-blog.csdnimg.cn/img_convert/e960ee95006b68e187a09fd83afa6d50.png)
这里Apple类没有定义__call__()方法,因此其对象实例不是可调用对象,但是类本身是可调用的,因为调用类实际上就是返回一个实例,类似于执行__init__()函数。
__call__()函数还有其它用途
Python可以进行元编程。有一个技巧就是,当你不想让用户能够实例化一个类,而只能使用类的静态方法的时候,你可以通过结合__call__()函数与元编程来实现:
![707ce5398acbeea951b8b71196c44fef.png](https://img-blog.csdnimg.cn/img_convert/707ce5398acbeea951b8b71196c44fef.png)
关于这个用法,可以参考小编的另一篇文章Python使用元类管理实例的创建