真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python裝飾器怎么定義

這篇文章主要介紹“Python裝飾器怎么定義”,在日常操作中,相信很多人在Python裝飾器怎么定義問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python裝飾器怎么定義”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

創(chuàng)新互聯(lián)是專業(yè)的灌云網(wǎng)站建設(shè)公司,灌云接單;提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行灌云網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

裝飾器(decorator)是一種高級Python語法。裝飾器可以對一個函數(shù)、方法或者類進行加工。在Python中,我們有多種方法對函數(shù)和類進行加工,比如在 Python閉包中,我們見到函數(shù)對象作為某一個函數(shù)的返回結(jié)果。相對于其它方式,裝飾器語法簡單,代碼可讀性高。因此,裝飾器在Python項目中有廣泛的應(yīng)用。

裝飾器最早在Python 2.5中出現(xiàn),它最初被用于加工函數(shù)和方法這樣的可調(diào)用對象(callable object,這樣的對象定義有__call__方法)。在Python 2.6以及之后的Python版本中,裝飾器被進一步用于加工類。

裝飾函數(shù)和方法

我們先定義兩個簡單的數(shù)學函數(shù),一個用來計算平方和,一個用來計算平方差:

# get square sumdef square_sum(a, b):    return a**2 + b**2# get square diffdef square_diff(a, b):    return a**2 - b**2
print(square_sum(3, 4))print(square_diff(3, 4))

在擁有了基本的數(shù)學功能之后,我們可能想為函數(shù)增加其它的功能,比如打印輸入。我們可以改寫函數(shù)來實現(xiàn)這一點:

# modify: print input# get square sumdef square_sum(a, b):    print("intput:", a, b)    return a**2 + b**2# get square diffdef square_diff(a, b):    print("input", a, b)    return a**2 - b**2
print(square_sum(3, 4))print(square_diff(3, 4))

我們修改了函數(shù)的定義,為函數(shù)增加了功能。

現(xiàn)在,我們使用裝飾器來實現(xiàn)上述修改:

def decorator(F):    def new_F(a, b):        print("input", a, b)        return F(a, b)    return new_F# get square sum@decoratordef square_sum(a, b):    return a**2 + b**2# get square diff@decoratordef square_diff(a, b):    return a**2 - b**2print(square_sum(3, 4))print(square_diff(3, 4))

裝飾器可以用def的形式定義,如上面代碼中的decorator。裝飾器接收一個可調(diào)用對象作為輸入?yún)?shù),并返回一個新的可調(diào)用對象。裝飾器新建了一個可調(diào)用對象,也就是上面的new_F。new_F中,我們增加了打印的功能,并通過調(diào)用F(a, b)來實現(xiàn)原有函數(shù)的功能。

定義好裝飾器后,我們就可以通過@語法使用了。在函數(shù)square_sum和square_diff定義之前調(diào)用@decorator,我們實際上將square_sum或square_diff傳遞給decorator,并將decorator返回的新的可調(diào)用對象賦給原來的函數(shù)名(square_sum或square_diff)。 所以,當我們調(diào)用square_sum(3, 4)的時候,就相當于:

square_sum = decorator(square_sum)
square_sum(3, 4)

我們知道,Python中的變量名和對象是分離的。變量名可以指向任意一個對象。從本質(zhì)上,裝飾器起到的就是這樣一個重新指向變量名的作用(name binding),讓同一個變量名指向一個新返回的可調(diào)用對象,從而達到修改可調(diào)用對象的目的。

與加工函數(shù)類似,我們可以使用裝飾器加工類的方法。

如果我們有其他的類似函數(shù),我們可以繼續(xù)調(diào)用decorator來修飾函數(shù),而不用重復(fù)修改函數(shù)或者增加新的封裝。這樣,我們就提高了程序的可重復(fù)利用性,并增加了程序的可讀性。

含參的裝飾器

在上面的裝飾器調(diào)用中,比如@decorator,該裝飾器默認它后面的函數(shù)是唯一的參數(shù)。裝飾器的語法允許我們調(diào)用decorator時,提供其它參數(shù),比如@decorator(a)。這樣,就為裝飾器的編寫和使用提供了更大的靈活性。

# a new wrapper layerdef pre_str(pre=''):    # old decorator
    def decorator(F):        def new_F(a, b):            print(pre + "input", a, b)            return F(a, b)        return new_F    return decorator# get square sum@pre_str('^_^')def square_sum(a, b):    return a**2 + b**2# get square diff@pre_str('T_T')def square_diff(a, b):    return a**2 - b**2print(square_sum(3, 4))print(square_diff(3, 4))

上面的pre_str是允許參數(shù)的裝飾器。它實際上是對原有裝飾器的一個函數(shù)封裝,并返回一個裝飾器。我們可以將它理解為一個含有環(huán)境參量的 閉包。當我們使用@pre_str('^_^')調(diào)用的時候,Python能夠發(fā)現(xiàn)這一層的封裝,并把參數(shù)傳遞到裝飾器的環(huán)境中。該調(diào)用相當于:

square_sum = pre_str('^_^') (square_sum)

裝飾類

在上面的例子中,裝飾器接收一個函數(shù),并返回一個函數(shù),從而起到加工函數(shù)的效果。在Python 2.6以后,裝飾器被拓展到類。一個裝飾器可以接收一個類,并返回一個類,從而起到加工類的效果。

def decorator(aClass):    class newClass:        def __init__(self, age):
            self.total_display   = 0
            self.wrapped         = aClass(age)        def display(self):
            self.total_display += 1            print("total display", self.total_display)
            self.wrapped.display()    return newClass
@decoratorclass Bird:    def __init__(self, age):
        self.age = age    def display(self):        print("My age is",self.age)
eagleLord = Bird(5)for i in range(3):
    eagleLord.display()

在decorator中,我們返回了一個新類newClass。在新類中,我們記錄了原來類生成的對象(self.wrapped),并附加了新的屬性total_display,用于記錄調(diào)用display的次數(shù)。我們也同時更改了display方法。

通過修改,我們的Bird類可以顯示調(diào)用display的次數(shù)了。

到此,關(guān)于“Python裝飾器怎么定義”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
新聞名稱:Python裝飾器怎么定義
文章起源:http://weahome.cn/article/gohjii.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部