Python中的可调用对象

Python中的可调用对象

十月 06, 2018

【什么是可调用对象?】

对于可以被当做函数直接来调用的对象,我们叫做可调用对象。

【如何实现一个可调用对象?】

在类下面实现一个特殊的方法__call__。

【可调用对象的意义】

在编码中,我们可以通过在类内部定义一个方法,在类外部直接使用对象实例化的方法来调用,同样也可以实现方法的调用。那么,使用__call__方法定义可调用对象又有什么意义呢?

【简化对象下方法的调用】

使用传统的在类下面定义方法的方式,需要首先实例化对象,再调用下面的方法:

class A():
def a():
return ‘this is a function’
A().a()

对于一个可调用的对象,我们可以使用更简便的方式调用:

class A():
    def __call__():
        return 'this is a function'
A()

对象下只有一个方法或者对象下某个方法使用频率很高的情况下,我们可以通过实现可调用对象来简化对象的调用方法。

flask框架下的可调用对象的实现示例

【模糊了对象和函数的区别—统一调用接口】

下面是一段示例代码,分别定义了三个功能相同但实现方式不同的方法或函数。在调用时,我们需要通过main函数来调用方法或函数来得到’hello’字符串,main函数是通过传入的param参数来调用的。但是由于定义的类不同、类下定义的方法名可能不同、函数的名也不同,我们无法确定param的类型,所以无法通过param来统一调用接口。

class A():
def go(self):
return ‘hello’

class B():
def run(self):
return ‘hello’

def func():
return ‘hello’

def main(param):

# 通过main的调用,传入param参数,得到'hello'字符串  
# b.run()  
# a.go()  
# func()  
# ...  
# 我们无法确定param参数的类型和名字,以至于没有办法统一调用接口

如果说main方法的param参数只接收函数类型的话,那么就很容易调用了:

class A():
def __call__(self):
return ‘hello’

class B():
def __call__(self):
return ‘hello’

def func():
return ‘hello’

def main(param):

# 通过main的调用,传入param参数,得到'hello'字符串  
param()  

通过实现可调用对象,就统一了调用的形式。也就是直接通过调用函数的方式来调用。