這篇文章主要介紹了Python裝飾器原理與用法,結合實例形式分析了Python裝飾器的概念、原理、使用方法及相關操作注意事項,需要的朋友可以參考下
本文實例講述了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()
運行結果:
##新加入的功能(3) 巢狀函數:在一個函數體內用def去宣告一個新的函數(不是呼叫)in the bar
def foo(): print('in the foo') def bar(): #声明一个新的函数,而不是调用函数 print('in the bar') bar() foo()運行結果:
in the foo4、裝飾器的語法:高階函數巢狀函數=》裝飾器(下面的範例可以用pycharm的偵錯器調試一下,看看程式碼的運行順序)in the bar
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 # 若无返回值,则返回None return 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 test15、帶參數的裝飾器運行時間: 3.0001718997955322
-------- -----分界線------------------------
in the test2 Tomwenxing
運行時間: 3.000171422958374
# -*- 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 res else: exit('用户名或密码有错误') elif auth_type=='ldap': print('暂不支持这种登录方式!') return wrapper return 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裝飾器原理與用法分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python腳本在Unix系統上無法運行的原因包括:1)權限不足,使用chmod xyour_script.py賦予執行權限;2)Shebang行錯誤或缺失,應使用#!/usr/bin/envpython;3)環境變量設置不當,可打印os.environ調試;4)使用錯誤的Python版本,可在Shebang行或命令行指定版本;5)依賴問題,使用虛擬環境隔離依賴;6)語法錯誤,使用python-mpy_compileyour_script.py檢測。

使用Python數組比列表更適合處理大量數值數據。 1)數組更節省內存,2)數組對數值運算更快,3)數組強制類型一致性,4)數組與C語言數組兼容,但在靈活性和便捷性上不如列表。

列表列表更好的forflexibility andmixDatatatypes,何時出色的Sumerical Computitation sand larged數據集。 1)不可使用的列表xbilese xibility xibility xibility xibility xibility xibility xibility xibility xibility xibility xibles and comply offrequent elementChanges.2)

numpymanagesmemoryforlargearraysefefticefticefipedlyuseviews,副本和內存模擬文件.1)viewsAllowSinglicingWithOutCopying,直接modifytheoriginalArray.2)copiesCanbecopy canbecreatedwitheDedwithTheceDwithThecevithThece()methodervingdata.3)metservingdata.3)memore memore-mappingfileShessandAstaStaStstbassbassbassbassbassbassbassbassbassbassbb

Listsinpythondonotrequireimportingamodule,helilearraysfomthearraymoduledoneedanimport.1)列表列表,列表,多功能和canholdMixedDatatatepes.2)arraysaremoremoremoremoremoremoremoremoremoremoremoremoremoremoremoremoremeremeremeremericdatabuteffeftlessdatabutlessdatabutlessfiblesible suriplyElsilesteletselementEltecteSemeTemeSemeSemeSemeTypysemeTypysemeTysemeTypysemeTypepe。

pythonlistscanStoryDatatepe,ArrayModulearRaysStoreOneType,and numpyArraySareSareAraysareSareAraysareSareComputations.1)列出sareversArversAtileButlessMemory-Felide.2)arraymoduleareareMogeMogeNareSaremogeNormogeNoreSoustAta.3)

WhenyouattempttostoreavalueofthewrongdatatypeinaPythonarray,you'llencounteraTypeError.Thisisduetothearraymodule'sstricttypeenforcement,whichrequiresallelementstobeofthesametypeasspecifiedbythetypecode.Forperformancereasons,arraysaremoreefficientthanl

pythonlistsarepartofthestAndArdLibrary,herilearRaysarenot.listsarebuilt-In,多功能,和Rused ForStoringCollections,而EasaraySaraySaraySaraysaraySaraySaraysaraySaraysarrayModuleandleandleandlesscommonlyusedDduetolimitedFunctionalityFunctionalityFunctionality。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Atom編輯器mac版下載
最受歡迎的的開源編輯器

記事本++7.3.1
好用且免費的程式碼編輯器