Python 裝飾器代碼解析
前言:
以往看到我博客的小伙伴可能都知道,我的前言一般都是吐槽和講廢話環(huán)節(jié),哈哈哈哈。今天難得休息,最近可真是太忙了,博主已經(jīng)連續(xù)一年都在996了,所以最近沒怎么學(xué)習(xí)新東西,只能回顧以往的舊知識了,上周一起工作的小伙伴扛不住996離職了,我們?nèi)说男F(tuán)隊(duì)也正式解散了,哎。原本想著找時(shí)間好好整理一個(gè)關(guān)于關(guān)于接口自動(dòng)化測試或ceph相關(guān)的東西。但由于篇幅過長這里目前可能不會著手寫這方面東西。其實(shí)啊寫是很簡單的,主要例子難找。哈哈哈哈。
好了回歸正題吧??催^我以往博客的小伙伴肯定見我用過@parameterized.expand()用作參數(shù)化的裝飾器。這屬于系統(tǒng)定義裝飾器,當(dāng)然我們自己也可以自定義裝飾器已適合我們?nèi)粘5拈_發(fā)需求。
**什么是裝飾器:**裝飾器的本質(zhì)就是一個(gè)函數(shù),作用是在不改變源代碼的情況下,給函數(shù)增加額外的功能;裝飾器的使用通過@語法糖進(jìn)行調(diào)用。
普通裝飾器:
直接上代碼吧。
def demo(func_test):
def wrapper():
print('定義的第一個(gè)裝飾器')
func_test()
print('裝飾器結(jié)束')
return wrapper #這里注意不要加括號
@demo
def func_test():
print('小白小白?。。。?)

直接使用自定義裝飾器強(qiáng)化的原方法。
帶有參數(shù)的裝飾器:
def demo(func_test):
def wrapper(name):
print('定義的第一個(gè)裝飾器')
func_test(name)
print('哦,你就是%s啊'%name)
print('裝飾器結(jié)束')
return wrapper
@demo
def func_test(name):
print('大家好我叫%s'%name)

是不是有點(diǎn)感覺了啊。
接下來就是不帶自定義參數(shù)的裝飾器
def demo(func_test):
def wrapper(*name,**kwargs):
print('定義的第一個(gè)裝飾器')
func_test(*name,**kwargs)
print('哦,你就是%s啊'%name[0])
print('你今年%s歲啊'%name[1])
print('裝飾器結(jié)束')
return wrapper
@demo
def func_test(name,age):
print('大家好我叫%s'%name)
print('今年{}'.format(age))

是不是很簡答啊。哈哈哈哈
多個(gè)裝飾一起使用。
def deco01(func):
def wrapper(*args,**kwargs):
print('第一層的裝飾器')
func(*args,**kwargs)
print('第一層裝飾器結(jié)束')
return wrapper
def deco02(func):
def wrapper(*args,**kwargs):
print('這是第二層裝飾器')
print('第二層裝飾器結(jié)束')
func(*args, **kwargs)
return wrapper
@deco02
@deco01
def func(a,b,c,name):
print('hello ,here is a func')
print("result is %d" %(a+b+c))
print('name:{}'.format(name))

看看執(zhí)行順序可以看出裝飾器是從上往下執(zhí)行的。
類裝飾器:
在使用裝飾器時(shí)我們總不能在一個(gè)文件里寫的都是裝飾器和各個(gè)方法吧,總是要分開的。這里就要是講一個(gè)類裝飾器。
這里呢,我大概了寫了一個(gè)讀取文件裝飾器的例子。
class Mydecorator():
def __init__(self,func):
# 定義為私有屬性
self.func = func
# 實(shí)現(xiàn)__call__方法,讓對象變成可以調(diào)用的對象,可調(diào)用的對象可以想函數(shù)那樣使用
def __call__(self, *args, **kwargs):
print('測試類裝飾器')
self.func(*args)
catalogue = args[0]
suffix = catalogue.split('.')[2]
try:
if suffix == 'json':
with open(*args,'r',encoding='utf-8') as file_object:
contents = json.load(file_object)
print(contents)
else:
with open(*args,'r',encoding='utf-8') as file_object:
contents = file_object.read()
print(contents)
except Exception as a:
print('讀取文件出錯(cuò)拉:{}'.format(a))
@Mydecorator
def name(name):
print('請輸入對應(yīng)文件路徑:%s'%name)

是不是很好用啊。哈哈哈哈
到此這篇關(guān)于Python 裝飾器代碼解析的文章就介紹到這了,更多相關(guān)Python 裝飾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Keras 實(shí)現(xiàn)查看model weights .h5 文件的內(nèi)容
這篇文章主要介紹了使用Keras 實(shí)現(xiàn)查看model weights .h5 文件的內(nèi)容,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python使用Socket(Https)Post登錄百度的實(shí)現(xiàn)代碼
以前都是用一些高級模塊,封裝的比較好,今天嘗試使用socket模塊登錄百度,弄了半天才弄好,主要由于百度在登陸頁使用了https,我們需要對socket進(jìn)行一定處理2012-05-05
python遍歷迭代器自動(dòng)鏈?zhǔn)教幚頂?shù)據(jù)的實(shí)例代碼
迭代器也是用來遍歷對象成員的,下面這篇文章主要給大家介紹了關(guān)于python遍歷迭代器自動(dòng)鏈?zhǔn)教幚頂?shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01
Django異步任務(wù)線程池實(shí)現(xiàn)原理
這篇文章主要介紹了Django異步任務(wù)線程池實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Python實(shí)現(xiàn)SSH隧道功能的示例代碼
SSH隧道是利用SSH協(xié)議建立一個(gè)加密通道,以保護(hù)通過不安全網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù),本文將介紹如何使用Python來實(shí)現(xiàn)SSH隧道功能,感興趣的可以了解下2025-02-02
Python數(shù)據(jù)結(jié)構(gòu)與算法中的棧詳解(2)
這篇文章主要為大家詳細(xì)介紹了Python中的棧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03

