LoginSignup
4
5

More than 5 years have passed since last update.

備忘録:Pythonデコレータ

Last updated at Posted at 2015-01-22

ただの関数

def hoge():
  print "aaaaaaabb"

hoge()
aaaaaaabb

なんの変哲もないですね。

関数をデコる

実はPythonは@(関数名)
という記述を関数定義の前につけることで入れ子状の構造に出来ます。
なので少しいじってみると


def deco(func):
  def aaa():
    print "wei soiya"
    func()
  return aaa

@deco
def hoge():
  print "aaaaaaabb"

hoge()
wei soiya
aaaaaaabb

前に一文追加されます

上の例だと

@deco
def hoge

とすることで

hoge()

deco(hoge)()

と等価になってます。

多重デコレータ+引数をもたせる

多重のデコレータを組ませることも、ラッパーを噛ますことでデコレータに引数を別途渡すことも出来るようです。

def deco1(name):
    def wrapper(func):
        def aaaa():
            print "your name is "+name
            print "deco1 called!"
            return func("aaa","www",yakiniku="teishoku")
        return aaaa
    return wrapper

def deco2(func):
    def bbbb(*args, **kwargs):
        print "wrap2 called!"
        return func(*args, **kwargs)
    return bbbb

@deco1('nanntara-kanntara-')
@deco2
def eee(*args, **kwargs):
    print args
    print kwargs
    return "done"

print eee()
your name is nanntara-kanntara-
deco1 called!
wrap2 called!
('aaa', 'www')
{'yakiniku': 'teishoku'}
done

以下のサイトを参考にしました。

4
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5