デコレータを生成するクラス。

コードは動作するデモ。便利じゃないけど。

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)

今回はコンストラクタの引数に、適用前後の処理を関数として渡したけれど、あまり意味がない。クラスの中でメソッド定義した方が有用なことが多そう。