2016/01/14

[Python]デコレータについて

初めてのPython第三版を読んでも完全にデコレータについて理解したとは言い切れないので、試しに作ってみた。

まずは、これ

def hoge(function):
  def bar(*args):
    print args
    print "hello"
  return bar

@hoge
def foo():
  print "python"
  return

foo()
これ実行すると
()
hello
となった。

上の構文は、翻訳すると下のようになる。
foo = hoge(foo)
foo()
hogeの引数内にて、functionが実行されていないのでpythonが表示されない。
def hoge(function):
  def bar(*args):
    print args
    function()
    print "hello"
  return bar

@hoge
def foo():
  print "python"
  return

foo()
こうすると
()
python
hello
となる。

これは割りと早く理解できたのだが、問題は、class内で使われるデコレータである。
def foo(function):
  def bar(*args):
    print args
    print function(*args) + "world"
  return bar

class Hoge():
  @foo
  def say(self):
    return "hello"

Hoge().say()
    
これは、
hoge = Hoge()
hoge.say = foo(hoge.say)
hoge.say()
と等価である。

0 コメント:

コメントを投稿