python裝飾器詳解

一卦停、什么是裝飾器

? ? ? ?裝飾器本質(zhì)上是一個(gè)Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個(gè)函數(shù)對象宝穗。它經(jīng)常用于有切面需求的場景鸽照,比如:插入日志螺捐、性能測試、事務(wù)處理矮燎、緩存定血、權(quán)限校驗(yàn)等場景。裝飾器是解決這類問題的絕佳設(shè)計(jì)诞外,有了裝飾器澜沟,我們就可以抽離出大量與函數(shù)功能本身無關(guān)的雷同代碼并繼續(xù)重用。

二峡谊、以下是一個(gè)時(shí)間模塊插入日志的裝飾器

import functools

import time

def add_logs(func):

'''

1.創(chuàng)建裝飾器茫虽,創(chuàng)建add_log裝飾器刊苍, 被裝飾的函數(shù)打印日志信息;

2. 日志格式為: [字符串時(shí)間] 函數(shù)名: xxx濒析, 運(yùn)行時(shí)間:xxx, 運(yùn)行返

? ? :paramfunc:

? ? :return:

'''

? ? def wrapper(*args,**kw):

start_time = time.time()

res = func(*args,**kw)

end_time = time.time()

print ('函數(shù)名:{0} 運(yùn)行時(shí)間:{1}'.format(func.__name__ , (end_time - start_time)))

return res

return wrapper

@add_logs

def add(x,y):

time.sleep(1)

return x+y

a = add(1,20)

print(a)


從上面的例子中可以可以看出:裝飾器就是一個(gè)閉包正什,閉包的定義:在一個(gè)內(nèi)部函數(shù)中,對外部作用域的變量進(jìn)行引用号杏,(并且一般外部函數(shù)的返回值為內(nèi)部函數(shù))婴氮,那么內(nèi)部函數(shù)就被認(rèn)為是閉包。

三盾致、介紹一個(gè)用戶權(quán)限模塊的裝飾器案例:

# Create an account

user_auth = [{'username':'lufei','password':'123456'}]

# # 初始登錄狀態(tài)信息

# current_dic = {'username': None, 'login': False}

# Initial login status information

login_dic = {'username':None, 'login':False}

# Create login function decorator

def auth_func(func):

def wrapper(*args,**kwargs):

if login_dic['username']and login_dic['login']:

res = func(*args, **kwargs)

return res

while True:

username =input('plase input username:')

password =input('plase input password:')

for user_dicin user_auth:

if username == user_dic['username']and password == user_dic['password']:

login_dic['username'] = username

login_dic['login'] =True

? ? ? ? ? ? ? ? ? ? res = func(*args, **kwargs)

return res

else:

print('password is error')

return wrapper()

@auth_func

def index():

print('歡迎來到天貓購物商城')

@auth_func

def shoppingcar():

print('購物車:%s主经,%s,%s' % ('火鍋底料', '三明治', '冰淇淋'))

index()

shoppingcar()


從上面的例子可以看出來我們用裝飾器做了一個(gè)登錄模塊的驗(yàn)證功能的裝飾器庭惜,驗(yàn)證用戶是否登錄成功罩驻,一個(gè)電商網(wǎng)站很多模塊都要判斷用戶的的權(quán)限,只有用戶登錄成功护赊,采用權(quán)限下單惠遏,支付,評價(jià)等等操作百揭,我們不需要每一個(gè)模塊都要驗(yàn)證用戶的登錄狀態(tài)爽哎,只需要寫一個(gè)判斷登錄權(quán)限的裝飾器就完美解決了,大大的提高了代碼的冗余和開發(fā)的效率器一。

四课锌、介紹一個(gè)用戶緩存模塊的裝飾器案例

緩存的應(yīng)用場景:數(shù)據(jù)在需要頻繁查詢,且每次查詢都需要大量計(jì)算或者等待時(shí)間之后才能返回結(jié)果的情況祈秕,使用緩存來提高查詢速度渺贤,用內(nèi)存空間換取查詢、加載的時(shí)間请毛。

那緩存應(yīng)該采用什么數(shù)據(jù)結(jié)果呢志鞍?

1.便于查詢的,且能快速獲得數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)方仿,每次查詢的時(shí)候固棚,只要輸入一致,就應(yīng)該得到同樣的結(jié)果(順序也一致仙蚜,例如減法函數(shù)此洲,參數(shù)順序不一致,結(jié)果不一樣)基于上面的分析委粉,此數(shù)據(jù)結(jié)構(gòu)應(yīng)該是字典呜师。

import time

import datetime

def cache(d={},cache_time=3):

def _cache(func):

def wrapper(*args,**kwargs):

if d.get(args)is None or datetime.datetime.now().timestamp()-d[args][1]>cache_time:

value = func(*args,**kwargs)

d[args] = (value,datetime.datetime.now().timestamp())

return value

else:

print('using cache')

print(d[args][0])

return d[args][0]

return wrapper

return _cache

@cache(cache_time=15)

def test_func(x,y):

print(x**y)

return x**y

test_func(1,2)

time.sleep(4)

test_func(1,2)

test_func(2,4)

test_func(2,4)



參考文獻(xiàn):https://blog.csdn.net/weixin_43936969/article/details/103823711

參考文獻(xiàn):https: // blog.csdn.net / maergaiyun / article / details /82724679

參考文獻(xiàn):https://blog.csdn.net/qq_32835305/article/details/86561995?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贾节,隨后出現(xiàn)的幾起案子汁汗,更是在濱河造成了極大的恐慌衷畦,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件知牌,死亡現(xiàn)場離奇詭異祈争,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)送爸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進(jìn)店門铛嘱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暖释,“玉大人袭厂,你說我怎么就攤上這事∏蜇埃” “怎么了纹磺?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長亮曹。 經(jīng)常有香客問我橄杨,道長,這世上最難降的妖魔是什么照卦? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任式矫,我火速辦了婚禮,結(jié)果婚禮上役耕,老公的妹妹穿的比我還像新娘采转。我一直安慰自己,他們只是感情好瞬痘,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布故慈。 她就那樣靜靜地躺著,像睡著了一般框全。 火紅的嫁衣襯著肌膚如雪察绷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天津辩,我揣著相機(jī)與錄音拆撼,去河邊找鬼。 笑死喘沿,一個(gè)胖子當(dāng)著我的面吹牛闸度,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摹恨,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼筋岛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晒哄?” 一聲冷哼從身側(cè)響起睁宰,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤肪获,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后柒傻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孝赫,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年红符,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了青柄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,687評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡预侯,死狀恐怖致开,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情萎馅,我是刑警寧澤双戳,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布,位于F島的核電站糜芳,受9級特大地震影響飒货,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜峭竣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一塘辅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧皆撩,春花似錦扣墩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喻粹,卻和暖如春蟆融,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背守呜。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工型酥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人查乒。 一個(gè)月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓弥喉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親玛迄。 傳聞我的和親對象是個(gè)殘疾皇子由境,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 裝飾器本質(zhì)上是一個(gè)函數(shù),該函數(shù)用來處理其他函數(shù),它可以讓其他函數(shù)在不需要修改代碼的前提下增加額外的功能虏杰,裝飾器的返...
    胡一巴閱讀 406評論 0 0
  • 1. 什么是裝飾器 知乎大佬如是說:內(nèi)褲可以用來遮羞讥蟆,但是到了冬天它沒法為我們防風(fēng)御寒,聰明的人們發(fā)明了長褲纺阔,有了...
    我只是我筆下的小丑閱讀 279評論 0 1
  • 一瘸彤、裝飾器的基本使用 在不改變函數(shù)源代碼的前提下,給函數(shù)添加新的功能笛钝,這時(shí)就需要用到“裝飾器”质况。 0.開放封閉原則...
    NJingZYuan閱讀 524評論 0 0
  • 在學(xué)習(xí)Python的過程中,我相信有很多人和我一樣玻靡,對Python的裝飾器一直覺得很困惑结榄,我也是困惑了好久,并通過...
    愚灬墨閱讀 457評論 1 1
  • 裝飾器 創(chuàng)建裝飾器啃奴, 要求如下:創(chuàng)建add_log裝飾器潭陪, 被裝飾的函數(shù)打印日志信息雄妥;日志格式為: [字符串時(shí)間]...
    ivan_cq閱讀 362評論 0 0