質問
PythonプログラミングでAOPを使用しようとしていますが、存在するさまざまなライブラリの経験がありません。
だから私の質問は:
PythonにはどのようなAOPサポートがありますか?そして、それらの間の異なるライブラリの利点は何ですか?
編集
いくつかを見つけましたが、それらがどのように比較されるのかわかりません:
編集2
これらはどのコンテキストで使用しますか?
Pythonで書かれた2つのアプリケーションがあり、通常は税金やその他の金銭を計算するメソッドがあります。 「スケルトン」を書きたいのですが。機能の追加、実行時のカスタマイズ、たとえば、フルスタックをオーバーロードすることなく、地方税の適用方法を変更します(国、州、市など)。
解決
編集:私はもはや重苦しさを維持しておらず、何年も維持されていません。代わりに他の回答の1つを検討するか、このウィキペディアのリスト。
Python用の別のAOPライブラリは pytilities
(ドキュメント; svn repo )。現時点で最も強力です(私の知る限り)。
その機能は次のとおりです。
- 再利用可能なアスペクトクラスを作成
- インスタンスまたはクラスに複数の側面を適用する
- インスタンス/クラスへのアスペクトの適用解除
- アスペクトを使用してインスタンスに新しい属性を追加します
- インスタンス/クラスのすべての属性にアドバイスを適用する
- ...
また、いくつかの特別な記述子などの他の利点もあります(ドキュメントを参照)
他のヒント
いくつかのすばらしい例については、Pythonデコレータに関するS.Lottのリンクを参照してください。また、を参照してください。デコレータのPEPの定義。
Pythonには最初からAOPがありましたが、印象的な名前はありませんでした。 Python 2.4では、デコレータの構文が追加されました。これにより、デコレータを構文的に非常にうまく適用できます。
ルールに基づいてデコレータを適用したい場合はライブラリが必要かもしれませんが、宣言するときに関連する関数/メソッドをマークしたい場合はおそらくしないでしょう。
これは、単純なキャッシュデコレータの例です(この質問のために書きました):
import pickle, functools
def cache(f):
_cache = {}
def wrapper(*args, **kwargs):
key = pickle.dumps((args, kwargs))
if key not in _cache:
_cache[key] = f(*args, **kwargs) # call the wrapped function, save in cache
return _cache[key] # read value from cache
functools.update_wrapper(wrapper, f) # update wrapper's metadata
return wrapper
import time
@cache
def foo(n):
time.sleep(2)
return n*2
foo(10) # first call with parameter 10, sleeps
foo(10) # returns immediately
Pythonでは、アスペクト指向プログラミングは通常、実行時にクラスとインスタンスを動的に変更することで構成されます。これは通常、モンキーパッチと呼ばれます。別のAOP質問への回答で、これらの PythonでのAOPの使用例。
アノテーションを使用することは、実際にはAOPではありません。これは、製織プロセスが多少ハードコーディングされているためです。
PythonにはいくつかのAOPフレームワークがあります(そのうち8つを数えて比較しましたが、そのうち Aspyct
が明らかな勝者でした)。
実際の業界のユースケースを含む、次の会議の1つに関する調査結果を含む論文を公開します。
Pythonデコレーターライブラリから始めます。その多くはAOPのようなものです。
BSDライセンスの python-aspectlib はどうですか?
実装ステータス
関数、メソッド、インスタンス、クラスの織り込みが完了しました。