python 可呼叫物件之類例項
可呼叫物件,即任何可以通過函式操作符()來呼叫的物件。
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函式內部,我們可以大大的簡化我們的程式碼,不需要再針對的性的去做判斷,這就是可呼叫例項類的用處之一。