前言
本文實例講述了Python裝飾器原理與用法。分享給大家供大家參考,具體如下:
1、裝飾器的本質是函數,主要用來裝飾其他函數,也就是為其他函數添加附加功能
2、裝飾器的原則:
(1) 裝飾器不能修改被裝飾的函數的源代碼
(2) 裝飾器不能修改被裝飾的函數的調用方式
3、實現裝飾器的知識儲備
(1) Python中函數即‘變量’
a、變量在Python中的存儲
x='Tomwenxing'
y=x
[說明]:
當Python解釋器遇到語句x='Tomwenxing’時,它主要完成了兩樣工作:
1.在內存中開辟了一片空間用來存儲字符串‘Tomwenxing’
2.在內存從創建了一個名為x的變量,并用它指向字符串‘Tomwenxing’所占據的內存空間(可以理解為房間和房間號的關系)
而語句y=x意為將變量x對字符串的引用賦值給變量y,即在內存中創建一個變量y,并使其指向變量x所指向的內存空間
b、函數在Python中的存儲
def test():pass
[說明]:
在Python中,函數的存儲和變量相似,以上面的函數為例,Python解釋其主要做兩件事:
1.在內存中開辟一個內存空間,用來存儲函數代碼的字符串(本例中代碼只有一句:pass)
2.在內存中創建一個變量test,用來指向存儲函數代碼字符串的內存空間**(相當于test=‘函數體’)**
因此說在Python中函數即變量
(2) 高階函數(下面兩個條件滿足任何一個即為高階函數)
a、把一個函數名當做實參傳遞給另外一個函數
[對裝飾器的影響]:達到“在不修改被裝飾函數源代碼的情況下為其添加功能”的效果
import time
def bar():time.sleep(2)print('in the bar')
def test(func):start\_time=time.time()func()stop\_time=time.time()print('函數的運行時間為:',stop\_time-start\_time)
test(bar)
運行結果:
in the bar
函數的運行時間為: 2.0021145343780518
b、返回值中包含函數名
[對裝飾器的影響]:達到“不改變函數的調用方式“的效果
import time
def bar():time.sleep(3)print('in the bar')
def test2(func):print('新添加的功能')return func
bar=test2(bar)
bar()
運行結果:
新添加的功能
in the bar
(3) 嵌套函數:在一個函數體內用def去聲明一個新的函數(不是調用)
def foo():print('in the foo')def bar(): #聲明一個新的函數,而不是調用函數print('in the bar')bar()
foo()
運行結果:
in the foo
in the bar
4、裝飾器的語法:高階函數+嵌套函數=》裝飾器 (下面的例子可以用pycharm的調試器調試一下,看看代碼的運行順序)
import time
def timer(func):def deco(\*args,\*\*kwargs):#使用了不定參數start\_time=time.time()res=func(\*args,\*\*kwargs) #運行函數stop\_time=time.time()print('運行時間:',stop\_time-start\_time)return res # 若無返回值,則返回Nonereturn deco
@timer #等價于test1=timer(test1)=deco,即test1()=deco()
def test1():time.sleep(3)print('in the test1')
@timer #等價于test2=timer(test2)=deco,即test2(name)=deco(name)
def test2(name):time.sleep(3)print('in the test2',name)
test1()
print('-------------分界線------------------------')
test2('Tomwenxing')
運行結果:
in the test1
運行時間: 3.0001718997955322
-------------分界線------------------------
in the test2 Tomwenxing
運行時間: 3.000171422958374
5、帶參數的裝飾器
\# -\*- coding:utf-8 -\*-
user,passwd='Tomwenxing','123'
#如裝飾器帶參數,一般是三層嵌套
def auth(auth\_type): #第一層的參數是裝飾器的參數def outer\_wrapper(func):#第二層的參數是裝飾器要裝飾的目標函數def wrapper(\*args,\*\*kwargs):#第三次的參數是目標函數的參數if auth\_type=='local':username = input('Username:').strip()password = input('Password:').strip()if user == username and passwd == password:print('用戶Tomwenxing已經成功登錄!')res = func(\*args, \*\*kwargs) #運行目標函數return reselse:exit('用戶名或密碼有錯誤')elif auth\_type=='ldap':print('暫不支持這種登錄方式!')return wrapperreturn outer\_wrapper
def index():print('歡迎來到index頁面')
@auth(auth\_type='local') #home=wrapper()
def home(name):print('%s,歡迎來到home頁面' %name)return 'This is home page'
@auth(auth\_type='ldap')
def bbs():print('歡迎來到bbs頁面 ')
index()
print('----------------------分界線-------------------')
print('函數的返回值為:',home('wenxing'))
print('----------------------分界線-------------------')
bbs()
運行結果:
歡迎來到index頁面
----------------------分界線-------------------
Username:Tomwenxing
Password:123
用戶Tomwenxing已經成功登錄!
wenxing,歡迎來到home頁面
函數的返回值為: This is home page
----------------------分界線-------------------
暫不支持這種登錄方式!
關于Python技術儲備
學好 Python 不論是就業還是做副業賺錢都不錯,但要學會 Python 還是要有一個學習規劃。最后大家分享一份全套的 Python 學習資料,給那些想學習 Python 的小伙伴們一點幫助!
微信掃描下方CSDN官方認證二維碼免費領取【保證100%免費
】

一、Python所有方向的學習路線
Python所有方向的技術點做的整理,形成各個領域的知識點匯總,它的用處就在于,你可以按照上面的知識點去找對應的學習資源,保證自己學得較為全面。
二、Python基礎學習視頻
② 路線對應學習視頻
還有很多適合0基礎入門的學習視頻,有了這些視頻,輕輕松松上手Python~在這里插入圖片描述
③練習題
每節視頻課后,都有對應的練習題哦,可以檢驗學習成果哈哈!
因篇幅有限,僅展示部分資料
三、精品Python學習書籍
當我學到一定基礎,有自己的理解能力的時候,會去閱讀一些前輩整理的書籍或者手寫的筆記資料,這些筆記詳細記載了他們對一些技術點的理解,這些理解是比較獨到,可以學到不一樣的思路。
四、Python工具包+項目源碼合集
①Python工具包
學習Python常用的開發軟件都在這里了!每個都有詳細的安裝教程,保證你可以安裝成功哦!
②Python實戰案例
光學理論是沒用的,要學會跟著一起敲代碼,動手實操,才能將自己的所學運用到實際當中去,這時候可以搞點實戰案例來學習。100+實戰案例源碼等你來拿!
③Python小游戲源碼
如果覺得上面的實戰案例有點枯燥,可以試試自己用Python編寫小游戲,讓你的學習過程中增添一點趣味!
五、面試資料
我們學習Python必然是為了找到高薪的工作,下面這些面試題是來自阿里、騰訊、字節等一線互聯網大廠最新的面試資料,并且有阿里大佬給出了權威的解答,刷完這一套面試資料相信大家都能找到滿意的工作。
六、Python兼職渠道
而且學會Python以后,還可以在各大兼職平臺接單賺錢,各種兼職渠道+兼職注意事項+如何和客戶溝通,我都整理成文檔了。
這份完整版的Python全套學習資料已經上傳CSDN,朋友們如果需要可以微信掃描下方CSDN官方認證二維碼免費領取【保證100%免費
】
