裝飾器:本質是函式,用於裝飾其他函式,為其他函式新增附加功能
原則:1.不能比修改被裝飾的函式的**
2.不能修改被裝飾的函式的呼叫方式
import time
def timmer(func):
def warpper(*args,**kwargs):
start_time=time.time()
func()
stop_time=time.time()
print(start_time,stop_time)
return warpper()
@timmer
def test1():
time.sleep(3)
print('i am test1 !!!!!')
執行結果:
i am test1 !!!!!
1520652510.288641 1520652513.2888126
實現裝飾器知識儲備:
裝飾器=高階函式+巢狀函式
1.函式即「變數」
2.高階函式
a.把乙個函式名當作形參傳給另外乙個函式(在不修改被裝飾函式源**的情況下,為其新增功能)
b.返回值中包含函式名(不修改函式的呼叫方式)
3.巢狀函式
1.函式即"變數"
def foo():
print('in the foo !!!')
bar()
def bar():
print('i am bar !!!')
foo()
執行結果:
in the foo !!!
i am bar !!!
def bar():
print('in the bar !!!')
def test1(func):
print(func)
test1(bar)
執行結果:
def bar():
print('in the bar')
def test1(func):
print(func)
func()
test1(bar)
執行結果:
in the bar
import time
def bar():
print('in the bar !!!')
def test1(func):
start_time=time.time()
func()
stop_time=time.time()
print('in the fun !!!')
print(start_time,stop_time)
test1(bar)
執行結果:
in the bar !!!
in the fun !!!
1520656155.743149 1520656155.743149
import time
def bar():
time.sleep(3)
def test2(func):
print(func)
return func
print (test2(bar))
執行結果:
import time
def bar():
time.sleep(3)
def test2(func):
print(func)
return func
print (test2(bar))
t=test2(bar)
print(t)
執行結果:
import time
def bar():
time.sleep(3)
print('in the bar !!!')
def test2(func):
print(func)
return func
bar=test2(bar)
bar()
執行結果:
in the bar !!!
def foo():
print('in the foo')
def bar():
print('in the bar')
bar()
foo()
執行結果:
in the foo
in the bar
import time
def deco(func):
start_time=time.time()
func()
stop_time=time.time()
def test1():
time.sleep(3)
print('in the test1')
def test2():
time.sleep(3)
print('in the test2')
#deco(test1)
test1=deco(test1)
#deco(test2)
test2=deco(test2)
in the test1
in the test2
import time
def timer(func):
def deco():
start_time=time.time()
func()
stop_time=time.time()
print(start_time,stop_time)
return deco
def test1():
time.sleep(3)
print('in the test1')
def test2():
time.sleep(3)
print('in the test2')
print(timer(test1))
test1() #--->執行deco()函式
執行結果:
.deco at 0x005841e0>
import time
def timer(func):
def deco():
start_time=time.time()
func()
stop_time=time.time()
print(start_time,stop_time)
return deco
@timer # 等同於 test1=timer(test1)
def test1():
time.sleep(3)
print('in the test1')
def test2():
time.sleep(3)
print('in the test2')
test1()
執行結果:
in the test1
1520663936.4761815 1520663939.476353
python三大神器 裝飾器
裝飾器 decorator 能增強now 函式的功能,比如,在函式呼叫前後自動列印日誌,但又不希望修改now 函式的定義,這種在 執行期間動態增加功能的方式,稱之為。本質上,decorator就是乙個返回函式的高階函式。所以,我們要定義乙個能列印購物的decorator,可以定義如下 def inn...
Python三大神器之 裝飾器
def info print 這是學生資訊 info a info print id a print id info a 展示 4009632 4009632 這是學生資訊def info return 小王 defsuccess print 返回值函式 def printinfo func par...
搞定三大神器之 Python 裝飾器
學會 python 裝飾器 裝飾器,幾乎各大python框架中都能看到它的身影,足以表明它的價值!它有動態改變函式或類功能的魔力!本專題的目錄 學會 python 裝飾器 1 什麼是裝飾器 2 裝飾器的結構 3 為什麼要這樣 4 裝飾乙個函式 5 裝飾乙個類 6 裝飾器層疊 7 溫馨提醒 總結1 什...