デコレータを生成するクラス。
コードは動作するデモ。便利じゃないけど。
class Advice(object): def __init__(self, beg=None, end=None): self.beg = beg self.end = end def __call__(self, fn): def _fn(*args, **kw): if self.beg: self.beg() r = fn(*args, **kw) if self.end: self.end() return r return _fn import sys verbose = Advice(beg=lambda : sys.stdout.write("called\n")) @verbose def f(x): return x * x @Advicer(end=lambda : sys.stdout.write("N + 1\n")) def g(x): return x + 1 print f(10) print g(10)
今回はコンストラクタの引数に、適用前後の処理を関数として渡したけれど、あまり意味がない。クラスの中でメソッド定義した方が有用なことが多そう。