有沒有pythonic
維護狀態的方法(例如爲了優化目的),而沒有完全面向對象?如何在沒有類的情況下在Python中維護狀態?
爲了說明我的問題比較好,這是我在JavaScript中經常使用模式的一個例子:
var someFunc = (function() {
var foo = some_expensive_initialization_operation();
return someFunc (bar) {
// do something with foo and bar
}
}());
外部講,這僅僅是一個函數像任何其他,而無需初始化對象之類的東西,但閉包允許計算單個時間的值,然後我將其作爲常量使用。
Python中的一個示例是優化正則表達式時 - 使用re.compile
並存儲match
和search
操作的編譯版本很有用。
的唯一途徑,我知道在Python做到這一點是通過在模塊範圍內設置變量:
compiled_regex = compile_my_regex()
def try_match(m): # In reality I wouldn't wrap it as pointlessly as this
return compiled_regex.match(m)
,或者通過創建類:
class MatcherContainer(object):
def __init__(self):
self.compiled_regex = compile_my_regex()
def try_match(self, m):
self.compiled_regex.match(m)
my_matcher = MatcherContainer()
前一種方式是廣告-hoc,並且它不是很清楚該函數和它上面聲明的變量是相互關聯的。它也污染了模塊的命名空間,我不太滿意。
後一種方法在樣板上看起來冗長而有點沉重。
我能想到的唯一方法就是將所有這些功能都分解成單獨的文件(模塊)並只導入函數,這樣一切都很乾淨。
有關如何處理此問題的更多經驗豐富的Pythoners的任何建議?或者你只是不擔心它,繼續解決問題?
我個人認爲你的班級創作沒有問題。詳細程度很好。 「'顯式比隱式更好。」 – tMC 2012-08-08 14:18:50
一種至少使用該類的方法不會太冗長,那就是將'try_match'重命名爲'__call__',它可以讓你像構造函數一樣使用它(構造之後)。但是,正如在@ glglgl的回答中,您的JavaScript代碼實際上直接轉換爲Python。 – lvc 2012-08-08 14:27:03
是否在第一個例子中調用someFunc?還是應該是函數定義? – soulcheck 2012-08-08 14:46:50