日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python里的装饰器

發布時間:2025/3/15 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python里的装饰器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2018-1-29

1.首先我們要知道什么是函數?
函數是將一段代碼邏輯,通過特殊的語法組織起來,它可以有參數和返回值,也可以在別的地方被調用!

def res(int x,int y):sum=x+y;return sum;print(res(2,3));

def是關鍵字,res是函數名,x與y是參數,
sum=x+y是函數體,return sum是返回語句。

函數可以有參數,也可以沒有,可以有返回值,也可以沒有,
python中返回值默認返回None。

2.什么是裝飾器?
先寫一個簡單的裝飾器,看不懂沒事的

def log(func):def wrapper(*args,**kwargs): #動態參數print("begin call %s"%func.__name__)temp=func(*args,**kwargs) #動態參數print("after call %s"%func.__name__)return temp return wrapper

裝飾器本質上就是一個函數,
用來裝飾別的函數,給其他函數附加新的功能。

原則:
(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)函數即變量

def f():print("i am f")time.sleep(2)n=f n() #就可以執行這個函數

函數就是一個變量,那么它就可以作為參數,也可以作為返回值。

(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里的装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。