1
def decorator(func):
   def wrapper(func):
     do something before
     func()
     do something later

   return wrapper

func =decorator(func)---->これは私の装飾されていない関数ですfunc()は装飾されたものを実行し、出力を提供します。

シンプルに飾ってみませんか?

def decorator(func):

    do something before
    func()
    do something later

decorator(func)

私が見ることができる唯一の利点は、ある場合には、割り当てて再利用するためのfuncオブジェクトを取得することです。質問は少し曖昧だと思いますが、装飾だけを目的とするのに、なぜ関数オブジェクトを返す必要があるのでしょうか。私は何の利点を意味しますか?

4

2 に答える 2

3

装飾された関数を複数の場所で使用したい場合は、関数オブジェクトを返して再利用する必要があります

2番目の例では、呼び出しをdecorator(func)呼び出しますfunc。つまり、デコレータの動作(つまり、「前の何か」と「後の何か」)が必要な場合は、decorator(func)毎回呼び出す必要があります。

デコレータのポイントは、効果的に実行しfunc = decorator(func)、その後、呼び出すfuncと自動的にデコレータの動作を呼び出すことです。

于 2013-02-27T07:38:44.017 に答える
1

デコレータ構文の意味を検討してください。これ:

@decorator
def say_hi():
    print "Hello!"

このためのシンタックスシュガーです:

def say_hi():
    print "Hello!"
say_hi = decorator(say_hi)

したがって、デコレータは基本的に関数を受け取り、変更された新しい関数を返します。別の言い方をすれば、装飾の前にsay_hi、関数です。その後、それはまだ機能です…変更されたものではありますが。

デコレータが次のように記述されている場合:

def decorator(fn):
  return "Something else"

次に、装飾の前say_hiは関数になりますが、その後は代わりに「Something else」(文字列)の値になります。これで、呼び出し可能ではなくなります。

于 2013-02-27T07:40:42.123 に答える