いくつかの優れた例については、Python デコレーターに関する S.Lott のリンクを参照し、デコレーターの定義 PEP を参照してください。
Python には最初から AOP がありましたが、印象的な名前がありませんでした。Python 2.4 では、decorator 構文が追加されました。これにより、decorator を構文的に非常にうまく適用できます。
ルールに基づいてデコレータを適用したい場合は、ライブラリが必要になるかもしれませんが、宣言するときに関連する関数/メソッドをマークしたい場合は、おそらく必要ありません。
単純なキャッシュ デコレータの例を次に示します (この質問のために書きました)。
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