python callable可调用对象(实现__call__)

callable可调用对象

对于这种可以被当做函数直接来调用的对象,我们称为可调用的对象,可调用的对象的实现就是在他们内部要实现特殊的__call__()方法。

可调用对象的意义:

python callable可调用对象(实现__call__)_第1张图片

  • 简化对象下方法的调用,比如说我们有一个对象a,下面有一个func()方法,我们要调用func()方法的时候要使用a.func()来调用。但是如果我们要是把func()方法的内部实现写到我们__call__方法里面的话,那么a这个对象就变成一个可调用的对象,那么我们再次调用的时候就不需要使用a.方法了,而直接a()就可以调用对象下面的方法了。那么这个是一种简化。下面我们来看一下在哪些情况下把一个对象实现成可调用对象:构造函数不算,例如Aborter这个类,他下面只有一个方法,它就直接把它实现成一个可调用对象。另外一种情况就是,对象下面的某个方法使用很多的时候,别的方法都不常用,只有某个方法他使用的很多,那么这种情况下,也可以把某个方法实现成__call__的方式
  • 模糊了对象和函数的区别,这种情景不是很好理解,如果说一个对象是可调用对象的话,我们可以直接使用a()的形式调用,这种调用形式几乎和我们函数的调用形式是一样的func(),但是这个意义就在于它可以统一调用的接口,我们来看下面的示例

可调用方法的使用场景

class A():
    def go(self):
        return object()

class B():
    def run(self):
        return object()

def func():
    return object()

def main(callable):
    callable()
    # 我想在main中调用传入的参数,得到一个对象object
    # b.run()
    # a.go()
    # func()
    # ...
    pass

main(A())
main(B())
main(func())

上面的代码可以发现当我们调用main方法的时候,还需要确定传入的对象(例如A(),B())里面的方法名是什么,这样写很不好,所以我们就可以改写成下面的代码

class A():
    def __call__(self):
        print("A")

class B():
    def __call__(self):
        print("B")

def main(callable):
    callable()
    # 我想在main中调用传入的参数,得到一个对象object
    # b.run()
    # a.go()
    # func()
    # ...

main(A())
main(B())

python callable可调用对象(实现__call__)_第2张图片

这样就不用区别到底是A类型还是B类型的对象了。

你可能感兴趣的:(Python)