python文件下载速度 装饰器_python学习笔记之---装饰器
# -*- coding:utf-8 -*-
'''示例1: 最簡單的函數(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ù)對象,返回原函數(shù)對象
裝飾的實(shí)質(zhì)語句: 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: 使用語法@來裝飾函數(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 #等價于: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ù)來確保每次新函數(shù)都被調(diào)用
裝飾器的規(guī)則:
規(guī)則1:
函數(shù)func上面定義了@xxxx,那么等價于?func?=?xxxx(func)
規(guī)則2:
裝飾函數(shù)xxxx,必須返回一個閉包(一個內(nèi)置函數(shù)+func)
'''示例4: 使用內(nèi)嵌包裝函數(shù)來確保每次新函數(shù)都被調(diào)用,
內(nèi)嵌包裝函數(shù)的形參和返回值與原函數(shù)相同,裝飾函數(shù)返回內(nèi)嵌包裝
函數(shù)對象'''
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)----->返回一個閉包:_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í)行過程解釋:
裝飾函數(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ù)對象
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.")
第五步:對帶參數(shù)的函數(shù)進(jìn)行裝飾
'''示例5: 對帶參數(shù)的函數(shù)進(jìn)行裝飾,
內(nèi)嵌包裝函數(shù)的形參和返回值與原函數(shù)相同,裝飾函數(shù)返回內(nèi)嵌包裝
函數(shù)對象'''
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
第六步:對參數(shù)數(shù)量不確定的函數(shù)進(jìn)行裝飾
'''示例6: 對參數(shù)數(shù)量不確定的函數(shù)進(jìn)行裝飾,
參數(shù)用(*args, **kwargs),自動適應(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--->返回了一個閉包_deco+func+s
后面的過程跟上一步的過程一樣。
'''
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.(不需要對象實(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.(不需要對象實(shí)例)
before myfunc called [].
locker.acquire() called.(這是靜態(tài)方法)
myfunc() called.
locker.release() called.(不需要對象實(shí)例)
第九步:裝飾器帶類參數(shù),并分拆公共類到其他py文件中,同時演示了對一個函數(shù)應(yīng)用多個裝飾器
'''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ù)應(yīng)用多個裝飾
器'''
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)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的python文件下载速度 装饰器_python学习笔记之---装饰器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 接口批量同步数据_千手接口平台+电商ER
- 下一篇: cad画直角命令_炸了,CAD fro命