溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python怎么實(shí)現(xiàn)裝飾器

發(fā)布時(shí)間:2021-11-02 17:50:48 來(lái)源:億速云 閱讀:143 作者:小新 欄目:開(kāi)發(fā)技術(shù)

小編給大家分享一下Python怎么實(shí)現(xiàn)裝飾器,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

普通裝飾器:

直接上代碼吧。

def demo(func_test):
    def wrapper():
        print('定義的第一個(gè)裝飾器')
        func_test()
        print('裝飾器結(jié)束')
    return wrapper    #這里注意不要加括號(hào)


@demo
def func_test():
    print('小白小白?。。。?#39;)

Python怎么實(shí)現(xiàn)裝飾器

直接使用自定義裝飾器強(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)

Python怎么實(shí)現(xiàn)裝飾器

是不是有點(diǎn)感覺(jué)了啊。
接下來(lái)就是不帶自定義參數(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))

Python怎么實(shí)現(xiàn)裝飾器

是不是很簡(jiǎn)答啊。哈哈哈哈
多個(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))

Python怎么實(shí)現(xiàn)裝飾器

看看執(zhí)行順序可以看出裝飾器是從上往下執(zhí)行的。
類(lèi)裝飾器:
在使用裝飾器時(shí)我們總不能在一個(gè)文件里寫(xiě)的都是裝飾器和各個(gè)方法吧,總是要分開(kāi)的。這里就要是講一個(gè)類(lèi)裝飾器。
這里呢,我大概了寫(xiě)了一個(gè)讀取文件裝飾器的例子。

class Mydecorator():
    def __init__(self,func):
    # 定義為私有屬性
        self.func = func
    # 實(shí)現(xiàn)__call__方法,讓對(duì)象變成可以調(diào)用的對(duì)象,可調(diào)用的對(duì)象可以想函數(shù)那樣使用
    def __call__(self, *args, **kwargs):   
        print('測(cè)試類(lèi)裝飾器')
        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('請(qǐng)輸入對(duì)應(yīng)文件路徑:%s'%name)

Python怎么實(shí)現(xiàn)裝飾器

以上是“Python怎么實(shí)現(xiàn)裝飾器”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI