裝飾器的理解

2021-08-27 11:34:22 字數 2317 閱讀 5515

首先函式是可以呼叫的物件:

import time

def new():

print(time.time())

a = new

a()

如果有乙個需求,保證new()不變的情況下,增加new()函式的功能,新增一行輸出等等。

在函式執行期間動態增加功能的方式叫做裝飾器decorator

從定義上理解decorator的滿足要素:

首先不能動原函式

其次不能改原函式的呼叫方式,原來執行new()呼叫,增加了裝飾器之後執行new()依然可以呼叫裝飾後的函式

現有乙個new()函式:

import time

def new():

print(time.time())

new()

輸出時間是格林尼治時間到現在的秒數,如果新增乙個需求,當函式執行時輸出時間,用我們熟悉的時間格式展示出來,

假定函式名稱是  ti

直接將new函式當作引數傳到ti裡邊是一種形式,但是這改變了函式new的呼叫方式,

如果使用new = ti(new),將ti(new)作為新的new再呼叫new,這樣呼叫方式就沒有改變,

但是呼叫new以後相當於new()--------> ti(new)()   這種形式,

開始實踐:

import time,datetime

def ti(func):

print(datetime.datetime.now())

return func()

def new():

print(time.time())

new = ti(new)

new()

new = ti(new)可以用更簡潔的方式:

@ti@ti放在new函式上一行,它作用於new()函式,等同於new = ti(new)

乙個簡單的裝飾器就出來了。

如果new函式需要引數怎麼辦?

import time,datetime

def ti(func):

print('now: %s'%datetime.datetime.now())

return func(*args,**kwargs)

@tidef new(sec=''):

print(time.time(),sec)

new('seconds')

解決傳入引數。

此時執行

print(new.__name__)
輸出結果:

@functools.wraps(func)

import functools,time,datetime

def ti(func):

@functools.wraps(func)

print('now: %s'%datetime.datetime.now())

return func(*args,**kwargs)

@tidef new(sec=''):

print(time.time(),sec)

new('seconds')

這時候的print(new.__name__)

輸出就會顯示new了,解決。

hold on

如果ti需要傳入引數呢。。。

ti傳入引數的位置只能在@ti處,那是在ti函式外唯一一次可以傳入引數的機會,傳入的形式只能是@ti('canshu')

先分析這個形式的意思,@ti後邊跟的是 ('canshu') ,然後再是new()函式,也就是new = ti('canshu')(new)

如果在ti外部再加一層函式newti,它包含引數('canshu'),然後返回乙個ti函式,ti執行的時候傳入new,後邊就不用變了

如下:

import functools,time,datetime

def newti(text):

def ti(func):

@functools.wraps(func)

print('now: %s\n%s'%(datetime.datetime.now(),text))

return func(*args,**kwargs)

return ti

@newti('end')

def new(sec=''):

print(time.time(),sec)

new('seconds')

解決。

暫時理解到這裡。

python裝飾器理解 python裝飾器理解

裝飾器 在不改變原函式的 和呼叫方法的基礎上,給原函式增加額外的功能 理解宣告 為了方便理解,以下例子採用最簡潔的函式和新增的功能 給原函式新增乙個執行時間 import time def timer func def inner func return inner timer func timer...

python裝飾器 理解Python裝飾器

在python中,對於乙個函式,若想在其執行前後做點什麼,那麼裝飾器是再好不過的選擇,話不多說,上 usr bin env coding utf 8 script 01.py author howie from functools import wraps def decorator func wr...

python裝飾器理解 python裝飾器的理解

python裝飾器應該算是面試常考到的用點,之前在flask的應用中也是會常常用到,抽空仔細看書查資料理解了下裝飾器的概念,通過自己的理解記憶,應該對這個概念會有乙個大致上具體的了解。閉包說起python裝飾器,我們應該不得不談談閉包的概念。我對閉包的理解是,當函式存在巢狀,子函式呼叫了父函式的變數...