python関数デコレータ
名前が示すように、デコレータは関数の2次処理に使用されます。たとえば、私たちは関数を書くために一生懸命働いてきましたが、今度は新しい関数を追加する必要がありますが、現時点ではどうしますか?明らかに、コードの量が多い場合、コードを再度変更することは費用効果が高くありません。つまり、複数の関数に同じ関数を追加する必要があります。貼り付けとコピーの効率が明らかに良くない場合は、今回はデコレータを導入します。
栗をあげる
次に、関数を定義します
import time
def need_change():
time.sleep(2)#让它沉睡2秒
次に、このプログラムの実行時間を計算するタイミング関数を追加する必要があります。
このように変更します
import time
def need_change():
star=time.time()
time.sleep(2)#让它沉睡2秒
end=time.time()
print(end-star)
非常に優れており、機能が正常に変更および追加されたため、このような機能を追加する必要のあるプログラムが10個あります。
装飾機能を書く
私たちの目的は、関数が追加された新しい関数を取得することです。この場合、関数を直接定義すると、この関数は新しい関数を返すことができます。
def decorate(func):
def new_function():
star=time.time()
func()
end=time.time()
print(end-star)
return new_function
したがって、新しい関数を直接返すことがわかります。
import time
def need_change():
time.sleep(2)#让它沉睡2秒
def decorate(func):
def new_function():
star=time.time()
func()
end=time.time()
print(end-star)
return new_function
need_change= decorate(need_change)
need_change()
ただし、ここで注意する必要があるのは、need_change関数は実際には元の関数ではなく、new_function関数であるということです。
それ以外の場合は、このコードを見ることができます。
import time
def need_change():
time.sleep(2)#让它沉睡2秒
def decorate(func):
def new_function():
star=time.time()
func()
end=time.time()
print(end-star)
return new_function
print('我是这个函数%s'%need_change.__name__)
need_change= decorate(need_change)
need_change()
print('我是这个函数%s'%need_change.__name__)
ジェリービーンズの使用
さらに便利なように、コードを変更できます。
import time
def decorate(func):
def new_function():
star=time.time()
func()
end=time.time()
print(end-star)
return new_function
@decorate
def need_change():
time.sleep(2)#让它沉睡2秒
need_change()
print('我是这个函数%s'%need_change.__name__)
この記号@は
need_change= decorate(need_change)
さて、それだけです。