2012-04-23 78 views
16

在Python中你可以調用實例通過實現__call__方法。例如當我應該實現__call__

class Blah: 
    def __call__(self): 
     print "hello" 

obj = Blah() 
obj() 

但我也能實現自己的方法,說「跑」:

class Blah: 
    def run(self): 
     print "hello" 

obj = Blah() 
obj.run() 

我什麼時候應該實現__call__

+9

當它是有道理的。 – 2012-04-23 20:39:50

+12

如果您不確定是否需要'__call__',那麼您不需要'__call__'。 – 2012-04-23 20:47:08

回答

19

這是很難回答。我的意見是,除非你的實際目標是創建一個功能,否則你不應該定義__call__。這不是你在創建傳統對象後應該做的事情。

換句話說,如果你開始想:「我要創建一個對象」你永遠不應該結束了實施__call__。另一方面,如果你開始思考「我要創建一個函數......但我希望我可以使用對象框架讓我的函數有一些狀態」,那麼你可以創建函數作爲一個對象狀態,並定義__call__以使其充當功能。

我想包括由@Paul Manta在評論的問題,在那裏他寫了建議的最後一個位:

如果你不確定,如果你需要__call__,那你就不要需要__call__

我認爲這是很好的建議。

+0

+1 - 有時候閉包變成了一個無法形容的混亂,而可調用的對象是更好的方法。但就是這樣。 – detly 2012-04-24 00:39:48

相關問題