可调用对象,即任何可以通过函数操作符()来调用的对象。
python可调用对象大致可以分为4类:
1、函数
python中有三种函数:内建函数(BIFs)、用户自定义函数(UDF)、lambda表达式
2、方法
和函数类似,方法也有內建方法(BIM)和用户自定义方法(UDM)。用户自定义方法是被定义为类的一部分的函数;內建方法,如一个python数据类型如列表和字典,也有方法,这些方法就叫做内建方法。
內建方法和内建函数不同之处在于,內建方法的__self__属性指向一个python对象,而内建函数的__self__指向None
3、类
实例化
4、某些类的实例
python给类创建了__call__的特别方法,该方法允许程序员创建可调用的对象(实例)。默认情况下,__call__()是没有实现的,即大多数的类的实例是不可调用的。而如果类中实现了这个方法,那么这个类的实例就成了可调用的了。
调用这样的实例等同于调用__call__()方法。
这里主要讲一下可调用实例的作用:
1、可以简化对象下方法的调用
如foo 类实现了__call__()方法,那么调用 foo() 和调用foo.__call__()是一样的。
这种使用与当对象下面只有一个方法的时候,或者对象下某个方法被使用很多次的情况下。
2、模糊了对象和函数的区别,这个具体有什么用呢?看个例子:
class A():
def get():
return object()
class B():
def run():
return object()
def foo():
return object()
上面创建了两个类和一个函数,现在我需要定义main函数,接收一个参数,并得到object对象
def Main(param):
# 如果param为A
param.get()
# 如果param为B
param.run()
# 如果param为foo
param()
Main(A())
Main(B())
Main(foo)
要完成这个需求,通过上面三种方式去分别调用,且需要在main函数内部去判断,当前调用的是哪个类
那么如果我把上面的三种情况换成可调用对象实例的方式去完成呢?
class A():
def __call__():
return object()
class B():
def __call__():
return object()
def foo():
return object()
这样改写后,同样要实现上面的需求,我们需要怎么做呢?
def Main(callableFun):
callableFun()
Main(A())
Main(B())
Main(foo)
可以看到,在main函数内部,我们可以大大的简化我们的代码,不需要再针对的性的去做判断,这就是可调用实例类的用处之一。