python之裝飾器

2021-08-31 16:19:45 字數 3312 閱讀 6605

講到裝飾器,到底什麼意思呢?

舉個例子:

去外面玩總要裝飾一下,整整齊齊乾乾淨淨的,女孩子會化化妝

做這些事情是為了我們看上去更美麗,更帥氣了等等

裝飾器和這個意思一樣,是為了給我們的函式加一些額外的功能讓我們的函式更強大

裝飾器用@來表示,我們之前講過物件導向的時候用到的靜態方法和類方法也是用@符號

我們之前寫函式是這樣寫:

如果我們計算的資料比較多呢。怎麼辦,這種方法就不好用了,這就用到我們的裝飾器了

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...