より詳細なデコレータ、目に見えるリンクを記述非常に明確に説明する勧告のは本当に強さ、:https://blog.csdn.net/buster_zr/article/details/81104551
1、デコレータ理論:
(1)デコレータは、実際には関数であります
(2)二つの特別な、ありますパラメータは関数です。戻り値はパラメータであり、
2、デコレータの理解するのは簡単:
実際には、プログラムに機能を追加することですが、プログラムはオンラインだったか、使用されている、あなたは、大量にそれほど非現実的なソースコードを変更することはできませんので、デコレータを持っていました。
注意点:
(1)装飾的な機能のソースコードに変更を加えることができ
(2)装飾的な機能方法を変更するために呼び出すことはできません
3、ウェイ・デコレーターの構成:
+高次関数の引数関数は、高階関数+ + +ネストされた関数のシンタックスシュガー=デコレータの値を返します。
高階関数について理解します:
(1)他の機能(「高次関数の引数」)に渡される引数として関数の名前
(2)戻り値は、関数名(「高次関数の戻り値」)が含まれ
ネストされた関数ことを理解しました:
ネストされた関数が代わりに呼び出す、関数の内部で定義された関数を参照します。
4、真のデコレータでの始まり:
ときに装飾デコレータ、各関数の前に付加する必要@xxx
(1) 引数なしの装飾機能、次のサンプルコード:
パラメータなしの#のデコ装飾機能
DEF タイマー(FUNC): #funcは、実際にテストを指し
DEF デコ():
スタート = time.time()
FUNC() 実際には#、ここでテストするための呼び出しで
STOP = time.timeは( )
印刷(STOP - スタート)
を返すデコを
@timer #test関数デコレータ
DEF テスト():
time.sleep(2 )
印刷(" 試運転がある" )
テスト()
印刷結果:
テストされて実行されています
2.003510952
(2)基準関数で飾ら、次のサンプルコード:
#装饰器装饰的函数有参数
def timer(func):
def deco(*args,**kwargs): #添加可变参数*args和**kwargs
start = time.time()
func(*args,**kwargs) #这里也是一样,添加可变参数*args和**kwargs
stop = time.time()
print (stop-start)
return deco
@timer
def test(value): #test函数有个参数value,正因为装饰器timer装饰的函数test有参数value,因此在timer中的有了可变参数
time.sleep(2)
print ("test is running %s" %value)
test("22")
打印结果:
test is running 22
2.00424408913
3、带参数的装饰器,示例代码如下:
#装饰器带参数
def timer(parameter):
def out_wapper(func):
def wapper(*wargs,**kwargs):
if parameter == "task1":
start = time.time()
func(*wargs,**kwargs)
stop = time.time()
print ("the task1 is run:",stop-start)
elif parameter == "task2":
func(*wargs, **kwargs)
print ("the task2 is run:")
return wapper
return out_wapper
@timer(parameter = "task1")
def task1():
time.sleep(2)
print "in the task1"
@timer(parameter = "task2")
def task2():
time.sleep(2)
print "in the task2"
task1()
task2()
打印结果:
in the task1
('the task1 is run:', 2.002906084060669)
in the task2
the task2 is run: