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

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

生活随笔

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

python

python文件下载速度 装饰器_python学习笔记之---装饰器

發(fā)布時(shí)間:2025/3/11 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python文件下载速度 装饰器_python学习笔记之---装饰器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

# -*- coding:utf-8 -*-

'''示例1: 最簡(jiǎn)單的函數(shù),表示調(diào)用了兩次'''

def myfunc():

print ("myfunc() called.")

myfunc()

myfunc()

E:\>py -3 a.py

myfunc() called.

myfunc() called.

第二步:使用裝飾函數(shù)在函數(shù)執(zhí)行前和執(zhí)行后分別附加額外功能

'''示例2: 替換函數(shù)(裝飾)裝飾函數(shù)的參數(shù)是被裝飾的函數(shù)對(duì)象,返回原函數(shù)對(duì)象

裝飾的實(shí)質(zhì)語(yǔ)句: myfunc = deco(myfunc)'''

defdeco(func):print ("before myfunc() called.")

func()print ("after myfunc() called.")returnfuncdefmyfunc():print ("myfunc() called.")

myfunc=deco(myfunc)

myfunc()

myfunc()

E:\>py -3 a.py

before myfunc() called.

myfunc() called.

after myfunc() called.

myfunc() called.

myfunc() called.

第三步:

'''示例3: 使用語(yǔ)法@來(lái)裝飾函數(shù),相當(dāng)于“myfunc = deco(myfunc)”

但發(fā)現(xiàn)新函數(shù)只在第一次被調(diào)用,且原函數(shù)多調(diào)用了一次'''

defdeco(func):print ("before myfunc() called.")

func()print ("after myfunc() called.")returnfunc

@deco #等價(jià)于:deco(myfunc)defmyfunc():print ("myfunc() called.")

myfunc()

myfunc()

E:\>py -3 a.py

before myfunc() called.

myfunc() called.

after myfunc() called.

myfunc() called.

myfunc() called.

------->>>>>>

執(zhí)行邏輯:

deco(myfunc)

print?("before?myfunc()?called.")

myfunc()

print?("??after?myfunc()?called.")

print?("?myfunc()?called.")

print?("?myfunc()?called.")

第四步:使用內(nèi)嵌包裝函數(shù)來(lái)確保每次新函數(shù)都被調(diào)用

裝飾器的規(guī)則:

規(guī)則1:

函數(shù)func上面定義了@xxxx,那么等價(jià)于?func?=?xxxx(func)

規(guī)則2:

裝飾函數(shù)xxxx,必須返回一個(gè)閉包(一個(gè)內(nèi)置函數(shù)+func)

'''示例4: 使用內(nèi)嵌包裝函數(shù)來(lái)確保每次新函數(shù)都被調(diào)用,

內(nèi)嵌包裝函數(shù)的形參和返回值與原函數(shù)相同,裝飾函數(shù)返回內(nèi)嵌包裝

函數(shù)對(duì)象'''

defdeco(func):def_deco():print ("before myfunc() called.")

func()print ("after myfunc() called.")#不需要返回func,實(shí)際上應(yīng)返回原函數(shù)的返回值

return_deco

@decodefmyfunc():print ("myfunc() called.")return 'ok'myfunc() #---->執(zhí)行閉包函數(shù)_deco()

myfunc()#---->執(zhí)行閉包函數(shù)_deco()

#myfunc=deco(myfunc)----->返回一個(gè)閉包:_deco的函數(shù)+myfunc

E:\>py -3 a.py

before myfunc() called.

myfunc() called.

after myfunc() called.

before myfunc() called.

myfunc() called.

after myfunc() called.

分析:

defdeco(func):def_deco():print ("before myfunc() called.")

func()print ("after myfunc() called.")#不需要返回func,實(shí)際上應(yīng)返回原函數(shù)的返回值

return_deco

閉包:_deco+func

@decodefmyfunc():print ("myfunc() called.")return 'ok'myfunc=deco(myfunc)

myfunc是什么?是閉包:_deco+myfunc

myfunc()--->_deco()

myfunc()--->_deco()defouter(name):definner():print(name)returninner

閉包:inner+name

執(zhí)行過(guò)程解釋:

裝飾函數(shù)deco

被裝飾函數(shù)myfunc

@deco

def myfunc():???--->myfunc= deco(myfunc)

myfunc= deco(myfunc)干了什么呢?

1 調(diào)用了deco(myfunc)

2??返回閉包:_deco+外包變量myfunc

3 閉包賦值給了myfunc

4 提醒myfunc變?yōu)榱碎]包函數(shù)對(duì)象

myfunc()---》干了什么呢?

1 _deco()執(zhí)行了

2 print ("before myfunc() called.")

3 myfunc()

4 print ("??after myfunc() called.")

myfunc()---》干了什么呢?

1 _deco()執(zhí)行了

2 print ("before myfunc() called.")

3 myfunc()

4 print ("??after myfunc() called.")

第五步:對(duì)帶參數(shù)的函數(shù)進(jìn)行裝飾

'''示例5: 對(duì)帶參數(shù)的函數(shù)進(jìn)行裝飾,

內(nèi)嵌包裝函數(shù)的形參和返回值與原函數(shù)相同,裝飾函數(shù)返回內(nèi)嵌包裝

函數(shù)對(duì)象'''

defdeco(func):def_deco(a, b):print ("before myfunc() called.")

ret=func(a, b)print ("after myfunc() called. result: %s" %ret)returnretreturn_deco

@decodefmyfunc(a, b):print ("myfunc(%s,%s) called." %(a, b))return a +b

myfunc(1, 2)

myfunc(3, 4)

E:\>py -3 a.py

before myfunc() called.

myfunc(1,2) called.

after myfunc() called. result: 3

before myfunc() called.

myfunc(3,4) called.

after myfunc() called. result: 7

第六步:對(duì)參數(shù)數(shù)量不確定的函數(shù)進(jìn)行裝飾

'''示例6: 對(duì)參數(shù)數(shù)量不確定的函數(shù)進(jìn)行裝飾,

參數(shù)用(*args, **kwargs),自動(dòng)適應(yīng)變參和命名參數(shù)'''

defdeco(func):def _deco(*args, **kwargs):print ("before %s called." % func.__name__)

ret= func(*args, **kwargs)print ("after %s called. result: %s" % (func.__name__, ret))returnretreturn_deco

@decodefmyfunc(a, b):print ("myfunc(%s,%s) called." %(a, b))return a+b

@decodefmyfunc2(a, b, c):print ("myfunc2(%s,%s,%s) called." %(a, b, c))return a+b+c

myfunc(1, 2)

myfunc(3, 4)

myfunc2(1, 2, 3)

myfunc2(3, 4, 5)

E:\>py -3 a.py

before myfunc called.

myfunc(1,2) called.

after myfunc called. result: 3

before myfunc called.

myfunc(3,4) called.

after myfunc called. result: 7

before myfunc2 called.

myfunc2(1,2,3) called.

after myfunc2 called. result: 6

before myfunc2 called.

myfunc2(3,4,5) called.

after myfunc2 called. result: 12

第七步:被裝飾函數(shù)加參數(shù):帶參數(shù)的裝飾器本質(zhì)都是兩層閉包

'''示例7: 在示例4的基礎(chǔ)上,讓裝飾器帶參數(shù),

和上一示例相比在外層多了一層包裝。

裝飾函數(shù)名實(shí)際上應(yīng)更有意義些'''

defdeco(arg):def_deco(func):def __deco():print ("before %s called [%s]." % (func.__name__, arg))

func()print ("after %s called [%s]." % (func.__name__, arg))return __deco

return_deco

@deco("mymodule")defmyfunc():print ("myfunc() called.")

@deco("module2")defmyfunc2():print ("myfunc2() called.")

myfunc()

myfunc2()

'''

1)多了一步:deco("hello") ---》返回了閉包:__deco+s

deco=閉包:__deco+s

2)@deco--->__deco(func)+s--->返回了一個(gè)閉包_deco+func+s

后面的過(guò)程跟上一步的過(guò)程一樣。

'''

E:\>py -3 a.py

before myfunc called [mymodule].

myfunc() called.

after myfunc called [mymodule].

before myfunc2 called [module2].

myfunc2() called.

after myfunc2 called [module2].

第八步:讓裝飾器帶 類 參數(shù)

'''示例8: 裝飾器帶類參數(shù)'''

classlocker:def __init__(self):print ("locker.__init__() should be notcalled.")

@staticmethoddefacquire():print ("locker.acquire() called.(這是靜態(tài)方法)")

@staticmethoddefrelease():print ("locker.release() called.(不需要對(duì)象實(shí)例)")defdeco(cls):'''cls 必須實(shí)現(xiàn)acquire和release靜態(tài)方法'''

def_deco(func):def __deco():print("before %s called [%s]." %(func.__name__, cls))

cls.acquire()try:returnfunc()finally:

cls.release()return __deco

return_deco

@deco(locker)defmyfunc():print ("myfunc() called.")

myfunc()

myfunc()

E:\>py -3 a.py

before myfunc called [].

locker.acquire() called.(這是靜態(tài)方法)

myfunc() called.

locker.release() called.(不需要對(duì)象實(shí)例)

before myfunc called [].

locker.acquire() called.(這是靜態(tài)方法)

myfunc() called.

locker.release() called.(不需要對(duì)象實(shí)例)

第九步:裝飾器帶類參數(shù),并分拆公共類到其他py文件中,同時(shí)演示了對(duì)一個(gè)函數(shù)應(yīng)用多個(gè)裝飾器

'''mylocker.py: 公共類 for 示例9.py'''

classmylocker:def __init__(self):print("mylocker.__init__() called.")

@staticmethoddefacquire():print("mylocker.acquire() called.")

@staticmethoddefunlock():print("mylocker.unlock() called.")classlockerex(mylocker):

@staticmethoddefacquire():print("lockerex.acquire() called.")

@staticmethoddefunlock():print("lockerex.unlock() called.")deflockhelper(cls):'''cls 必須實(shí)現(xiàn)acquire和release靜態(tài)方法'''

def_deco(func):def __deco(*args, **kwargs):print("before %s called." %func.__name__)

cls.acquire()try:return func(*args, **kwargs)finally:

cls.unlock()return __deco

return _deco

'''示例9: 裝飾器帶類參數(shù),并分拆公共

類到其他py文件中

同時(shí)演示了對(duì)一個(gè)函數(shù)應(yīng)用多個(gè)裝飾

器'''

from mylocker import *

classexample:

@lockhelper(mylocker)defmyfunc(self):print ("myfunc() called.")

@lockhelper(mylocker)

@lockhelper(lockerex)defmyfunc2(self, a, b):print ("myfunc2() called.")return a +bif __name__=="__main__":

a=example()

a.myfunc()print(a.myfunc())print (a.myfunc2(1, 2))print (a.myfunc2(3, 4))

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的python文件下载速度 装饰器_python学习笔记之---装饰器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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