什麼是裝飾器?
裝飾器是一種設計模式,可以在不改變原來函式的基本功能的基礎上,給原來的函式新增一些修飾的功能,作用是:可以降低**的耦合度
裝飾器的本質就是乙個閉包,把乙個函式作為引數
被裝飾函式本身變成了裝飾函式
被裝飾函式名__name__
也變成了裝飾函式的name名
簡單的計算時間的裝飾器
import time
def timer(func):
def wrap(*args,**kwargs):
t1 = time.clock()
result = func(*args,**kwargs)
t2 = time.clock()
print(t2)
return result
return wrap
@ timer
def foo(n):
x =1
for i in range(1,n+1):
x *=i
return x
a = foo(100)
print(foo(100))
被裝飾函式本身變成了裝飾函式
被裝飾函式名__name__也變成了裝飾函式的name名
in [53]: foo
out[53]: .wrap>
in [52]: foo.__name__
out[52]: 'wrap'
裝飾器類
import time
class b:
def __init__(self,func):
self.func = func
def __call__(self,*args,**kwargs):
t1 = time.clock()
result = self.func(*args,**kwargs)
t2 = time.clock()
print(t2)
return result@b
def foo(n):
x = 1
for i in range(1,n+1):
x *=i
return x
res = foo(10)
print(res)
多層裝飾器
import time
# 多層裝飾器
def deco1(func):
print("exec deco1")
def wrap1(*args,**kwargs):
print("執行了wrap1")
res = func(*args,**kwargs)
print("exit wrap1")
return res
print("退出了deco1")
return wrap1
def deco2(func):
print("exec deco2")
def wrap2(*args,**kwargs):
print("執行了wrap2")
res = func(*args,**kwargs)
print("exit wrap2")
return res
print("退出了deco2")
return wrap2
def deco3(func):
print("exec deco3")
def wrap3(*args,**kwargs):
print("執行了wrap3")
res = func(*args,**kwargs)
print("exit wrap3")
return res
print("退出了deco3")
return wrap3
@deco1
@deco2
@deco3
def foo(x,y):
return x**y
print("裝飾過程結束")
print(foo)
n = foo(3,4)
print(n)
'''#執行過程:
exec deco3
退出了deco3
exec deco2
退出了deco2
exec deco1
退出了deco1
裝飾過程結束
.wrap1 at 0x000002403cc93d90>
執行了wrap1
執行了wrap2
執行了wrap3
exit wrap3
exit wrap2
exit wrap1
81'''
'''其實這個裝飾過程,就是先執行了deco3(因為離的近),deco3執行完了後,foo已經變成了wrap3,這時開始執行deco2,deco2接收到的是wrap3,然後又將wrap3變成了wrap2,然後deco1開始執行這時又將wrap2變成了wrap1
wrap1執行,呼叫了wrap2,wrap2又呼叫了wrap3,wrap3執行完,又依次返回
'''
帶參裝飾器
import time
def timer(run_times):
def warp1(func):
def warp2(*args,**kwargs):
st = time.clock()
st1 = time.time()
for i in range(run_times):
result = func(*args,**kwargs)
et = time.clock()
et2 = time.time()
t3 = et2-st1
print("et為:{}".format(et))
print("t3為:{}".format(t3))
return result
return warp2
return warp1
@timer(100)
def jiechen(n):
x = 1
for i in range(1,n+1):
x *=i
return x
jiechen(1000)
retry 裝飾器
import time
import random
class retry(object):
def __init__(self, max_retries=3, wait=0, exceptions=(exception,)):
self.max_retries = max_retries
self.exceptions = exceptions
self.wait = wait
def __call__(self, func):
for i in range(self.max_retries + 1):
try:
result = func(*args, **kwargs)
except self.exceptions:
print("retey..")
time.sleep(self.wait)
continue
else:
return result
@retry(3,1,(valueerror))
def foo():
n = random.randint(-10,10)
if n>=0:
return n
else:
raise valueerror('n<0')
print(foo())
python3 深入裝飾器
def outer c def inner uname print 我是 end c uname return inner outer def fun 1 uname print f 北京的 fun 1 mike def outer c def inner args,kwargs 通用的形參的設定 ...
Python3 高階 裝飾器
1.裝飾器功能 在不修改原函式的情況下,增強函式功能 2.不帶引數的函式 不帶引數的裝飾器 1 foo 被裝飾的函式 2 show time 是裝飾器 coding utf 8 import time def show time func def inner start time time.time...
python3裝飾器 高階
作用 優化裝飾器 from functools import wraps 匯入wraps def wraps f wraps的語法糖 def inner args,kwargs ret f args,kwargs return ret return inner deff1 print hello,w...