は完全にオブジェクト指向行かなくても(例えば、最適化の目的のために)状態を維持するために、そこpythonic
方法はありますか?より良い私の質問を説明するためにクラスなしでPythonで状態を維持する方法は?
は、ここで私はJavaScriptで頻繁に使用するパターンの例です:
var someFunc = (function() {
var foo = some_expensive_initialization_operation();
return someFunc (bar) {
// do something with foo and bar
}
}());
外部これは、オブジェクトを初期化する必要があるか、そのようなものがないと、他のどのようなだけの機能です、しかし、クロージャを使うと計算値を1回だけ使用でき、それを本質的に定数として使用できます。
この例は、正規表現を最適化するときです。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
少なくともそのクラスの使用をより控え目にする方法の1つは、' try_match'の名前を '__call__'に変更することです。しかし、@ glglglの答えのように、あなたのjavascriptコードは実際に直接Pythonに変換されます。 – lvc
あなたの最初の例でsomeFuncが正しく呼び出されましたか?それとも関数定義であるべきですか? – soulcheck