python里的装饰器
2018-1-29
1.首先我們要知道什么是函數?
函數是將一段代碼邏輯,通過特殊的語法組織起來,它可以有參數和返回值,也可以在別的地方被調用!
def是關鍵字,res是函數名,x與y是參數,
sum=x+y是函數體,return sum是返回語句。
函數可以有參數,也可以沒有,可以有返回值,也可以沒有,
python中返回值默認返回None。
2.什么是裝飾器?
先寫一個簡單的裝飾器,看不懂沒事的
裝飾器本質上就是一個函數,
用來裝飾別的函數,給其他函數附加新的功能。
原則:
(1)不能修改被裝飾的函數的源代碼
(2)不能修改被裝飾函數的調用方式
應用場景:插入日志,性能測試,處理事務。
有一個功能,測試一個函數的運行時間
import time def f():print("i am f")time.sleep(2)def new_f():s_time=time.time() #開始時間f()e_time=time.time() #結束時間print("耗時:%s"%(e_time-s_time))new_f() #調用該函數為什么我們需要裝飾器呢?
如果我們一個項目中的每個函數都需要計算運行時間呢?難道我們要將計算時間的代碼復制到每一個函數中去?而且我們的調用方式可能也發生了變化!因為f()變了,那么我們的new_f()也可能也變了!這未免也太重復了。。。
我們還需要理解下面的概念:
(1)函數即變量
函數就是一個變量,那么它就可以作為參數,也可以作為返回值。
(2)高階函數
以函數作為參數,或者以函數作為返回值的函數
(3)函數嵌套
函數里面定義函數
高階函數 + 嵌套函數 <- 裝飾器
我們來寫一個裝飾器來實現之前的那一個功能
def my_time(func):s_time=time.time()func()e_time=time.time()print("%s耗時%s"%(func.__name__,(e_time-s_time)))貌似區別不是很大。。。
def my_time(func):def wrapper():s_time=time.time()func()e_time=time.time()print("%s耗時%s"%(func.__name__,(e_time-s_time)))return wrappern=my_time() #n => wrapper f=n n=my_time() #n => wrapper f=n可以轉換為:@my_time #這就是一個裝飾器 def f():print("i am f")time.sleep(2)如果一個函數需要加兩個功能?
那么我們就多重裝飾器,但是我們對順序做出了要求。
相當于一層一層的,從里到外依次裝飾,從外到里依次運行。
(1)加上返回值:
@my_time def f():return "i am f"此時我們用裝飾器就會出錯,因為裝飾器里面沒有返回值,所以我們需要將裝飾器帶上返回值
def my_time(func):def wrapper():temp=func()return temp return wrapper(2)加上參數:
@my_time def f(int x,int y):return x+y此時我們用裝飾器就會出錯,因為裝飾器里面沒有參數,所以我們需要將裝飾器帶上參數
def my_time(func):def wrapper(a,b):temp=func(a,b)return temp return wrapper如果說我們的參數個數不一定的話,那么我們就需要使用動態參數了。
但是我們還需要更加高級的裝飾器。。。
我們需要裝飾器內print的是變量
def log(text):def decortator(func):def wrapper(*args,**kwargs):print(text)temp=func(*args,**kwargs)return tempreturn wrapper return decortator@log('xueyi') def f(x,y):return x+y好神奇啊!
總結
以上是生活随笔為你收集整理的python里的装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内置函数、匿名函数,递归函数
- 下一篇: python学习之列表的定义以及增删改查