Python中__call__的用法

问题引出

  一般情况下类方法的调用是通过先创建类对象再通过a.b()的方式来调用,但是如果类中只有一个方法或者一个方法的使用频率非常高,那么就可以为这个方法命名为__call__来简化调用。

 

__call__

  存在__call__方法的类对象被称为可调用对象,它的作用可以总结为以下两点:

  • 简化了对象下方法的调用  (当某方法调用频率很高)
  • 模糊了对象和函数调用时的区别  (提高了代码的兼容性)

 

示例1

  创建一个类A,类A中有m、n两个函数,m的使用频率非常高,于是我们就可以用__call__来简化m的调用:

# 使用__call__前
class A():
    def m(self):
        print('a')
    def n(self):
        print('b')

a = A()
a.m()
# 使用__call__后
class A():
    def __call__(self):
        print('a')
    def n(self):
        print('b')

a = A()
a()

 

示例2

  创建类A和函数B,类A下的m函数与函数B功能类似;现在我们需要将A的对象和B函数作为参数传到函数C中去执行:

# 使用__call__前
class A():
    def m(self):
        print('good')
a = A()

def B():
    print('good')

def C1(func):
    func.m()
def C2(func):
    func()

C1(a)
C2(B)

  

  由于对象和函数调用上的区别我们必须要有两个不同的C函数才能实现相同的功能,而通过__call__我们就可以模糊两者的差别,提高程序的兼容性

# 使用__call__后
class A():
    def __call__(self):
        print('good')
a = A()

def B():
    print('good')

def C(func):
    func()

C(a)
C(B)

 

posted @ 2020-08-13 17:09  叶迩  阅读(8036)  评论(0编辑  收藏  举报