只是通過學習Python的工作,並開始看嵌套/工廠功能(簡單的例子):蟒蛇工廠函數相比
def maker(N):
def action(X):
return X * N
return action
是否有出廠功能在創建類的任何優勢?性能?記憶?清理?
只是通過學習Python的工作,並開始看嵌套/工廠功能(簡單的例子):蟒蛇工廠函數相比
def maker(N):
def action(X):
return X * N
return action
是否有出廠功能在創建類的任何優勢?性能?記憶?清理?
我最喜歡嵌套函數的地方在於它比類的冗長。等價類定義您的製造商的功能是:
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
嵌套函數允許您即時創建自定義函數。
看看例如decorators。結果函數依賴於在創建時綁定的變量,並且不需要在之後進行更改。所以使用班級爲此目的會使減少的意義。
比較一個功能工廠和一個班是比較蘋果和橙子。如果你有一個有凝聚力的數據和函數集合,就可以使用一個類,一起稱爲一個對象。如果您需要某個功能並且想要參數化其創建,請使用功能工廠。
您對這兩種技術的選擇應該取決於代碼的含義。
這是一個重大的時間差異..有趣的結果 – meade 2009-05-24 02:25:46