python裝飾器的用途是什么-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)python裝飾器的用途是什么的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。

創(chuàng)新互聯(lián)建站自2013年起,先為博樂(lè)等服務(wù)建站,博樂(lè)等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為博樂(lè)企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

首先,什么是裝飾器?

比較官方的解釋是:

裝飾器是用來(lái)管理和調(diào)用函數(shù)和類的一個(gè)可調(diào)用對(duì)象,也就是說(shuō)分為函數(shù)裝飾器和類裝飾器

這個(gè)定義函數(shù)我自己通俗化了一點(diǎn),不然更加看不懂,其實(shí)我還有一句更加概括的話,可以解釋裝飾器:

裝飾器就是對(duì)被裝飾的對(duì)象(函數(shù)、類)進(jìn)行重構(gòu)的,其可以在不改變?cè)瓉?lái)對(duì)象的情況下調(diào)用對(duì)象時(shí)執(zhí)行重構(gòu)后的行為

這里你可能就糊涂了,看不懂

沒(méi)關(guān)系我們慢慢來(lái)?。。?/p>

首先,裝飾器的語(yǔ)法你肯定知道

def decorator(f):
    def wrapper(x,y):
        return x+y
    return wrapper
@decorator
def func(x,y):
    return 1
func(3,4)

那,看這段代碼,你可能根據(jù)上面你有幾個(gè)疑問(wèn):

一、decorator是什么意思?

二、這里重構(gòu)的行為是什么?

三、整個(gè)裝飾的行為或者說(shuō)流程是怎么樣的?

我們看上面那一段代碼,很顯然,說(shuō)過(guò)裝飾器就是一個(gè)可調(diào)用對(duì)象,這個(gè)沒(méi)問(wèn)題吧,在上面的裝飾器它就是一個(gè)函數(shù)。

重構(gòu)的行為是什么?

上面的一段代碼的重構(gòu)行為就是講func的執(zhí)行代碼替換成了wrapper的執(zhí)行代碼,也就是說(shuō),代碼的最終輸入是 7 而不是 1。

其實(shí)上面的兩個(gè)問(wèn)題是廢話,我們解決了第三個(gè)問(wèn)題,自然而然的就理解了!

好了,在繼續(xù)看之前我們記住一句話:

裝飾器本身接受被裝飾的對(duì)象,裝飾器返回的可調(diào)用對(duì)象接受被裝飾對(duì)象的所有參數(shù)

一定要仔細(xì)看這句話,理解加記憶!

在上面那一段代碼中

裝飾器是: decorator

返回的可調(diào)用對(duì)象是: wrapper

被裝飾的對(duì)象是 :func

好了,你先在套這個(gè)你去看看這個(gè)這個(gè)函數(shù)的執(zhí)行流程

當(dāng)然,這時(shí)候你還會(huì)有一個(gè)疑問(wèn):

當(dāng)調(diào)用func(3,4)的時(shí)候發(fā)生了什么?

此時(shí):返回的可調(diào)用對(duì)象(wrapper)給了func,你也可以理解為現(xiàn)在的func的代碼是

def func(x,y):
    return x+y

這時(shí)的func就完全不是自己本身定義的func的,它是不是在某種意義上算是被重構(gòu)了!

到這里你是不是理解了什么是裝飾器,應(yīng)該是理解了!

不過(guò)我們還沒(méi)有結(jié)束,因?yàn)槲乙屇銖氐椎牧私馐裁词茄b飾器!

之前我們說(shuō)過(guò),不止有函數(shù)裝飾器,還有類裝飾器,那接下來(lái)我們就看看類裝飾器是怎么工作的,我還是要把之前那段話貼在這里,你別忘了!

裝飾器本身接受被裝飾的對(duì)象,裝飾器返回的可調(diào)用對(duì)象接受被裝飾對(duì)象的所有參數(shù)

class Decorator:
    def __init__(self,f):
        self.func = f
    def __call__(self,x,y):
        return self.func(x,y) + 1
@Decorator
def func(x,y):
    return x+y
func(3,4)
# 你來(lái)想想這時(shí)候的結(jié)果是什么?

我們來(lái)一步步的分析一下,

首先,我們說(shuō)裝飾器只接受被裝飾的對(duì)象做參數(shù),也就是說(shuō)此時(shí)有

Decorator(func)
 # 這段代碼對(duì)應(yīng)著第一句話
 # 接下來(lái)是
 func(3,4)
 # 這句話是不是觸動(dòng)了__call__方法
 # 接下來(lái)就是第二句話:返回的可調(diào)用對(duì)象接受被裝飾對(duì)象的所有參數(shù)
 # 所以3,4就被傳遞給了__call__方法
 # 此時(shí)的func是什么
 return self.func(x,y) + 1
 # 也就是說(shuō)結(jié)果為8,而不是7

接下來(lái)來(lái)點(diǎn)難的看看:

def decorator(f):
    def wrapper(self,x,y):
        return self.name + x + y
    return wrapper
class C:
    name = '土'
    @decorator
    def method(x,y):
        return x + y
ins = C()
myname = ins.method('行','孫')

感謝各位的閱讀!關(guān)于python裝飾器的用途是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

網(wǎng)站題目:python裝飾器的用途是什么-創(chuàng)新互聯(lián)
分享URL:http://bm7419.com/article38/cdehsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、商城網(wǎng)站、企業(yè)網(wǎng)站制作、微信公眾號(hào)Google、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)