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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM