__call__()是一种magic method,在类中实现这一方法可以使该类的实例(对象)像函数一样被调用。默认情况下该方法在类中是没有被实现的。使用callable()方法可以判断某对象是否可以被调用。
__call__()方法的作用其实是把一个类的实例化对象变成了可调用对象,也就是说把一个类的实例化对象变成了可调用对象,只要类里实现了__call__()方法就行。如当类里没有实现__call__()时,此时的对象p 只是个类的实例,不是一个可调用的对象,当调用它时会报错:‘Person’ object is not callable.
先看一个简单的案例
class People(object):
def __init__(self,name):
self.name=name
def __call__(self):
print("hello "+self.name)
a = People('无忌!')
a.__call__() # 调用方法一
a() # 调用方法二
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
结果:
hello 无忌!
hello 无忌!
- 1
- 2
在编写类的时候,如果写了__call__()方法,在实例化的对象进行调用的时候就会有 实例对象点__call__()和 object()这两种使用方式效果一样的现象,即调用方法一和调用方法二效果一样。
如下图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oCVksz4R-1598101822553)(C:\Users\Administrator\Desktop\类的call方法\1.png)]](https://img-blog.csdnimg.cn/20200822211047192.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU5MzMzMA==,size_16,color_FFFFFF,t_70#pic_center)
现在把Person类的实例p变成可调用的对象
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qRO4Dk21-1598101822559)(C:\Users\Administrator\Desktop\类的call方法\2.png)]](https://img-blog.csdnimg.cn/20200822211057356.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzU5MzMzMA==,size_16,color_FFFFFF,t_70#pic_center)
单看 p(‘Tim’) 你无法确定 p 是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。
其实p('Tim')相当于 #-->p.__call__('Tim')
总结:
1.python 可调用对象:可以通过内置函数callable来判断,如:
print(callable(p)) # True
- 1
2.如果类定义了__call__方法,那么它的实例可以变为可调用对象
参考:
https://blog.csdn.net/qq_42982682/article/details/104717797
https://blog.csdn.net/weixin_46260870/article/details/106304159