私は現在デコレータを試していますが、私は一つのことを理解できません。今、私は(私が思う)すべてを理解ティルPython - 内部関数を呼び出すデコレータ?
>>> foo('Jon')
Calling wrap()
Jon
:
def new_decorator(func):
print "Calling new_decorator()"
def wrap(arg):
print "Calling wrap()"
func(arg)
return wrap
@new_decorator
def foo(name):
print name
我々が得る実行している時:
'Calling decorate()'
のみfoo
を呼び出した後、私はシンプルなデコレータを持っています。開始時にnew_decorator(func)
が呼び出され、foo
がパラメータとして返され、wrap
を返します。
def add_attr(varname, value):
def decorate(func):
print "Calling decorate()"
setattr(func, varname, value)
return func
return decorate
@add_attr('var', 'New attribute')
def foo():
print "Calling foo()"
print foo.var
(foo()
を呼び出すことなく)、それを実行していることが返されます:
'Calling decorate()'
foo()
後:
>>> foo()
Calling foo()
New attribute
私は理解できない何かがあるしかし、今、私はパラメータでデコレータを試してみました、なぜこの "内部"関数decorate
は、開始時にと呼ばれ、foo
?最初の例ではそうではありませんでした。関数foo
はどのようにしてdecorate
にパラメータとして送信されましたか? add_attr
は2つのパラメータしか取得せず、いずれもfoo
ではありません。
おそらくあなたは*コール*ですか?そのアイテムを呼び出す何かの周りに角括弧を追加した場合... –
2番目のケースは、すでに内部飾りを呼び出す 'add_attr( 'var'、 'New attribute')(foo)'に似ています。 –
@MosesKoledoye私はそれを得る、ありがとう! –