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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python装饰器作用和功能_Python装饰器原理与用法分析

發(fā)布時(shí)間:2023/12/3 python 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python装饰器作用和功能_Python装饰器原理与用法分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這篇文章主要介紹了Python裝飾器原理與用法,結(jié)合實(shí)例形式分析了Python裝飾器的概念、原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Python裝飾器原理與用法。分享給大家供大家參考,具體如下:

1、裝飾器的本質(zhì)是函數(shù),主要用來(lái)裝飾其他函數(shù),也就是為其他函數(shù)添加附加功能

2、裝飾器的原則:

(1) 裝飾器不能修改被裝飾的函數(shù)的源代碼

(2) 裝飾器不能修改被裝飾的函數(shù)的調(diào)用方式

3、實(shí)現(xiàn)裝飾器的知識(shí)儲(chǔ)備

(1) Python中函數(shù)即‘變量'

a、變量在Python中的存儲(chǔ)x='Tomwenxing'

y=x

[說(shuō)明]:

當(dāng)Python解釋器遇到語(yǔ)句x='Tomwenxing'時(shí),它主要完成了兩樣工作:

1.在內(nèi)存中開(kāi)辟了一片空間用來(lái)存儲(chǔ)字符串‘Tomwenxing'

2.在內(nèi)存從創(chuàng)建了一個(gè)名為x的變量,并用它指向字符串‘Tomwenxing'所占據(jù)的內(nèi)存空間(可以理解為房間和房間號(hào)的關(guān)系)

而語(yǔ)句y=x意為將變量x對(duì)字符串的引用賦值給變量y,即在內(nèi)存中創(chuàng)建一個(gè)變量y,并使其指向變量x所指向的內(nèi)存空間

b、函數(shù)在Python中的存儲(chǔ)def test():

pass

[說(shuō)明]:

在Python中,函數(shù)的存儲(chǔ)和變量相似,以上面的函數(shù)為例,Python解釋其主要做兩件事:

1.在內(nèi)存中開(kāi)辟一個(gè)內(nèi)存空間,用來(lái)存儲(chǔ)函數(shù)代碼的字符串(本例中代碼只有一句:pass)

2.在內(nèi)存中創(chuàng)建一個(gè)變量test,用來(lái)指向存儲(chǔ)函數(shù)代碼字符串的內(nèi)存空間(相當(dāng)于test=‘函數(shù)體')

因此說(shuō)在Python中函數(shù)即變量

(2) 高階函數(shù)(下面兩個(gè)條件滿(mǎn)足任何一個(gè)即為高階函數(shù))

a、把一個(gè)函數(shù)名當(dāng)做實(shí)參傳遞給另外一個(gè)函數(shù)

[對(duì)裝飾器的影響]:達(dá)到“在不修改被裝飾函數(shù)源代碼的情況下為其添加功能”的效果import time

def bar():

time.sleep(2)

print('in the bar')

def test(func):

start_time=time.time()

func()

stop_time=time.time()

print('函數(shù)的運(yùn)行時(shí)間為:',stop_time-start_time)

test(bar)

運(yùn)行結(jié)果:in the bar

函數(shù)的運(yùn)行時(shí)間為: 2.0021145343780518

b、返回值中包含函數(shù)名

[對(duì)裝飾器的影響]:達(dá)到“不改變函數(shù)的調(diào)用方式“的效果import time

def bar():

time.sleep(3)

print('in the bar')

def test2(func):

print('新添加的功能')

return func

bar=test2(bar)

bar()

運(yùn)行結(jié)果:新添加的功能

in the bar

(3) 嵌套函數(shù):在一個(gè)函數(shù)體內(nèi)用def去聲明一個(gè)新的函數(shù)(不是調(diào)用)def foo():

print('in the foo')

def bar(): #聲明一個(gè)新的函數(shù),而不是調(diào)用函數(shù)

print('in the bar')

bar()

foo()

運(yùn)行結(jié)果:in the foo

in the bar

4、裝飾器的語(yǔ)法:高階函數(shù)+嵌套函數(shù)=》裝飾器 (下面的例子可以用pycharm的調(diào)試器調(diào)試一下,看看代碼的運(yùn)行順序)import time

def timer(func):

def deco(*args,**kwargs):#使用了不定參數(shù)

start_time=time.time()

res=func(*args,**kwargs) #運(yùn)行函數(shù)

stop_time=time.time()

print('運(yùn)行時(shí)間:',stop_time-start_time)

return res # 若無(wú)返回值,則返回None

return deco

@timer #等價(jià)于test1=timer(test1)=deco,即test1()=deco()

def test1():

time.sleep(3)

print('in the test1')

@timer #等價(jià)于test2=timer(test2)=deco,即test2(name)=deco(name)

def test2(name):

time.sleep(3)

print('in the test2',name)

test1()

print('-------------分界線(xiàn)------------------------')

test2('Tomwenxing')

運(yùn)行結(jié)果:in the test1

運(yùn)行時(shí)間: 3.0001718997955322

-------------分界線(xiàn)------------------------

in the test2 Tomwenxing

運(yùn)行時(shí)間: 3.000171422958374

5、帶參數(shù)的裝飾器# -*- coding:utf-8 -*-

user,passwd='Tomwenxing','123'

#如裝飾器帶參數(shù),一般是三層嵌套

def auth(auth_type): #第一層的參數(shù)是裝飾器的參數(shù)

def outer_wrapper(func):#第二層的參數(shù)是裝飾器要裝飾的目標(biāo)函數(shù)

def wrapper(*args,**kwargs):#第三次的參數(shù)是目標(biāo)函數(shù)的參數(shù)

if auth_type=='local':

username = input('Username:').strip()

password = input('Password:').strip()

if user == username and passwd == password:

print('用戶(hù)Tomwenxing已經(jīng)成功登錄!')

res = func(*args, **kwargs) #運(yùn)行目標(biāo)函數(shù)

return res

else:

exit('用戶(hù)名或密碼有錯(cuò)誤')

elif auth_type=='ldap':

print('暫不支持這種登錄方式!')

return wrapper

return outer_wrapper

def index():

print('歡迎來(lái)到index頁(yè)面')

@auth(auth_type='local') #home=wrapper()

def home(name):

print('%s,歡迎來(lái)到home頁(yè)面' %name)

return 'This is home page'

@auth(auth_type='ldap')

def bbs():

print('歡迎來(lái)到bbs頁(yè)面 ')

index()

print('----------------------分界線(xiàn)-------------------')

print('函數(shù)的返回值為:',home('wenxing'))

print('----------------------分界線(xiàn)-------------------')

bbs()

運(yùn)行結(jié)果:歡迎來(lái)到index頁(yè)面

----------------------分界線(xiàn)-------------------

Username:Tomwenxing

Password:123

用戶(hù)Tomwenxing已經(jīng)成功登錄!

wenxing,歡迎來(lái)到home頁(yè)面

函數(shù)的返回值為: This is home page

----------------------分界線(xiàn)-------------------

暫不支持這種登錄方式!

相關(guān)推薦:

以上就是Python裝飾器原理與用法分析的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!

本文原創(chuàng)發(fā)布php中文網(wǎng),轉(zhuǎn)載請(qǐng)注明出處,感謝您的尊重!

總結(jié)

以上是生活随笔為你收集整理的python装饰器作用和功能_Python装饰器原理与用法分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。