初めての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 コメント:
コメントを投稿