« 日記 |Main| 日記 »

« Pythonで階乗を求める(Yコンビネータ編) | Python | intをstrに変更できるか? »

パラメータを取るデコレータ

2通り書いてみました。

def showMessage(msg):
    def decorator(func):
        def foo(*args, **kw):
            print msg
            func(*args, **kw)

        return foo
    return decorator

@showMessage("Hello")
def foo():
    pass

foo()

# 以下は誤り
#class ShowMessage(object):
#    def __init__(self, msg):
#        self.msg
#    def __call__(self, func):
#        def foo(*args, **kw):
#            print msg
#            func(*args, **kw)
#
#        return foo
#
#@showMessage("Hello") # ←間違えて小文字にしたせいで1つめの定義を使って動いてしまった
def foo():
    pass

foo()

トラックバック(Trackback)

Trackback URL: http://www.nishiohirokazu.org/mt/mt-tb.cgi/377

フィードバック

by スルー | 2007年02月01日 11:44

動かないっすよ。 こうでは?

class ShowMessage(object):
    def __init__(self, msg):
        self.msg = msg
    def __call__(self, func):
        def wrap(*args, **kwds):
            print self.msg
            func(*args, **kwds)

        return wrap

@ShowMessage("Hello")
def foo():
    pass

foo()
おおっと。大文字小文字を間違えたせいで上で定義したデコレータを使ってしまっていましたね。訂正ありがとうございます。 それでばっちりです。

ご意見・ご感想をお送りください(フィードバック)

(フィードバックはメールで送信され、基本的に表示されませんが、内容によっては公開させていただくこともございます。ご了承ください。Your comment doesn't appear the page immediately. If the comment has value to other people, it will be put on the page or subsequent entries. Thank you.)

上の情報は、いずれも未記入でかまいません。 All of above questions are optional.