技術

デコレータはクラスに対しても使える

当たり前の事かもしれないけど、デコレータってクラスに対しても使えるのではないかとふと思い試してみたところ、普通に出来た。
最近デコレータについてググる事が多いけど、クラスを返すデコレータの例までぐらいはたまに見るけど、クラスに適用するデコレータの例は見たことが無かったような気が。

def viewable(c):
    ''''viewメソッドを追加するデコレータ'''
    def view(self):
        print 'view'
    if not hasattr(c, 'view'):
        c.view = view
    return c

@viewable
class C(object):
    def test(self):
        print 'test'

c = C()
c.test() # testと表示される
c.view() # viewと表示される

しかし見た目はかっこいいけど、静的にメソッドを追加したいなら普通に書くなり、継承するなりすべきだろうからこの例だと使い道はあまりなさそう。
メソッドの前後でログを取るようなデコレータを内包して、それをクラスの全メソッドに適用するようなデコレータにすると多少有用かな。

デコレータってそもそも func = deco(func) のシンタックスシュガーだから、その形で出来ることならなんでも出来る反面、じゃあデコレータ使わずに元の代入文で表現した方が分かりやすくね?って場合もありアレです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください