講到裝飾器,到底什麼意思呢?
舉個例子:
去外面玩總要裝飾一下,整整齊齊乾乾淨淨的,女孩子會化化妝
做這些事情是為了我們看上去更美麗,更帥氣了等等
裝飾器和這個意思一樣,是為了給我們的函式加一些額外的功能讓我們的函式更強大
裝飾器用@來表示,我們之前講過物件導向的時候用到的靜態方法和類方法也是用@符號
我們之前寫函式是這樣寫:
如果我們計算的資料比較多呢。怎麼辦,這種方法就不好用了,這就用到我們的裝飾器了
def laianxi(a,b):
return a+b
ret = laianxi(1,2)
print(ret) #3
下面看我們的裝飾器的強大之處:
def de(f):
def inner(*args,**kwargs):
ret = f(*args,**kwargs)
print(ret)
return ret
return inner
上面**解釋:
# 定義乙個函式,該函式返回內部函式:de函式返回inner函式
# 內部函式中呼叫原有待裝飾函式:呼叫我們下面的原有函式
# 然後再新增額外功能, (可做可不做。)最後返回原有函式的執行結果。
@de #裝飾器函式的名稱,這裡不要寫錯了
def zhuangsi(a,b):
return a+b
@dedef zhu(a,b):
return a*b
ret = zhuangsi(1,2)
re = zhu(2,2)
這裡我們看到裝飾器函式會把我們的結果給列印出來
考慮幾個為題:
1.帶引數的誰來接受?
2.裝飾器帶引數執行順序是什麼樣的?
下面我們就來解決這些問題:
def a(f): #最外層接受裝飾器引數
def inner(n): #中間層,來接受函式物件
def outer(*args,**kwargs): #這裡接受傳遞進來的兩個引數
ret= n(*args,**kwargs)
print(ret+f)
return ret #三個return這裡不要搞混了
return outer #中間層接收
return inner #最外層接收
@a(22)
def cc(a,b):
return a+b
re = cc(1,2)
print(re)
另乙個例子:
def start1(f):
wraps(f)
def iner(*args,**kwargs):
ret = f(*args,**kwargs)
print('我是1裝飾器')
return ret
return iner
def start2(n):
wraps(n)
def outer(*args,**kwargs):
re = n(*args,**kwargs)
print('我是2裝飾器')
return re
return outer
def sum_a(a):
if a==1:
ret = start1
else:
ret = start2
return ret
@sum_a(2)
def sd(a,b):
return a+b
d = sd(1,2)
print(d)
def de(f):
wraps(f)
def inner(*args,**kwargs):
ret = f(*args,**kwargs)
print(ret+10)
return ret
return inner
def der(f):
wraps(f)
def inner(*args,**kwargs):
ret = f(*args,**kwargs)
print(ret+20)
return ret
return inner
@der #第二個
@de #第乙個
def zhuangsi(a,b):
return a+b
rt = zhuangsi(1,2)
print(rt) #13,23,3
class df():
def __init__(self):
pass
def __call__(self,f):
wraps(f)
def outer(*args,**kwargs):
ret = f(*args,**kwargs)
print(ret)
return ret
return outer
@df()
def d(a,b):
return a+b
r = d(1,2)
print(r)
等價於上面的寫法,只不過在類裡面實現
我們就練習乙個
#根據傳入的引數判斷 寫入檔案還是直接print,
# f=1 直接列印, f=2寫入 a.txt檔案
import time
def cl(f):
def outer(n):
wraps(n)
def inner(*args,**kwargs):
t1 = time.time()
ret = n(*args,**kwargs)
t2 = time.time()
re = t2-t1
if f == 1:
print('耗時{}'.format(re))
else:
with open('a.txt','a+',encoding='utf-8') as e:
e.write(str(re))
return ret
return inner
return outer
@cl(2)
def haoshi(a,b):
time.sleep(3)
return a+b
c= haoshi(2.9,290)
print(c)
python裝飾器介紹 Python之裝飾器簡介
python函式式程式設計之裝飾器 1.開放封閉原則 簡單來說,就是對擴充套件開放,對修改封閉。在物件導向的程式設計方式中,經常會定義各種函式。乙個函式的使用分為定義階段和使用階段,乙個函式定義完成以後,可能會在很多位置被呼叫。這意味著如果函式的定義階段 被修改,受到影響的地方就會有很多,此時很容易...
python 找到裝飾器 Python之裝飾器
裝飾器本質上就是乙個python函式,他可以讓其他函式在不需要做任何 變動的前提下,增加額外的功能,裝飾器的返回值也是乙個函式物件。裝飾器的作用 在不改變原函式及原函式的執行的情況下,為原函式增加一些額外的功能,比如列印日誌 執行時間,登入認證等等。乙個簡單的裝飾器 import time def ...
Python之裝飾器
裝飾器就是乙個以函式作為引數並返回乙個替換函式的可執行函式 即裝飾器是乙個函式,其引數為函式,返回值也為函式 可理解為對函式的功能進行拓展,所以叫裝飾 outer為裝飾器,效果為給被裝飾函式返回值結果加負號 defouter fun definner x return fun x return in...