2009-05-23 79 views
17

只是通過學習Python的工作,並開始看嵌套/工廠功能(簡單的例子):蟒蛇工廠函數相比

def maker(N): 
    def action(X): 
     return X * N 
    return action 

是否有出廠功能在創建類的任何優勢?性能?記憶?清理?

回答

24

我最喜歡嵌套函數的地方在於它比類的冗長。等價類定義您的製造商的功能是:

class clsmaker(object): 
    def __init__(self, N): 
     self.N = N 
    def __call__(self, X): 
     return X * self.N 

似乎並沒有那麼糟糕,直到你開始增加更多的參數構造函數。然後這樣做,類方法爲每個參數都佔用一行,而函數只是獲取額外的參數。

事實證明,有一個速度優勢到嵌套函數,以及:

>>> T1 = timeit.Timer('maker(3)(4)', 'from __main__ import maker') 
>>> T1.timeit() 
1.2818338871002197 
>>> T2 = timeit.Timer('clsmaker(3)(4)', 'from __main__ import clsmaker') 
>>> T2.timeit() 
2.2137160301208496 

這可能是由於存在被捲入嵌套函數版本更少的操作碼:

>>> dis(clsmaker.__call__) 
    5   0 LOAD_FAST    1 (X) 
       3 LOAD_FAST    0 (self) 
       6 LOAD_ATTR    0 (N) 
       9 BINARY_MULTIPLY  
      10 RETURN_VALUE   
>>> act = maker(3) 
>>> dis(act) 
    3   0 LOAD_FAST    0 (X) 
       3 LOAD_DEREF    0 (N) 
       6 BINARY_MULTIPLY  
       7 RETURN_VALUE 
+3

這是一個重大的時間差異..有趣的結果 – meade 2009-05-24 02:25:46

2

嵌套函數允許您即時創建自定義函數。

看看例如decorators。結果函數依賴於在創建時綁定的變量,並且不需要在之後進行更改。所以使用班級爲此目的會使減少的意義。

13

比較一個功能工廠和一個班是比較蘋果和橙子。如果你有一個有凝聚力的數據和函數集合,就可以使用一個類,一起稱爲一個對象。如果您需要某個功能並且想要參數化其創建,請使用功能工廠。

您對這兩種技術的選擇應該取決於代碼的含義。