首頁  >  文章  >  後端開發  >  python裝飾器是什麼?怎麼用?

python裝飾器是什麼?怎麼用?

不言
不言轉載
2018-12-30 10:57:363227瀏覽

這篇文章帶給大家的內容是關於python裝飾器是什麼?怎麼用?有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

在學習python過程中,我相信大家對裝飾器的概念很模糊,我也是困惑了很久,決定寫一篇文章梳理一下。

首先要搞清楚什麼是裝飾器:

簡單來說,可以把裝飾器理解為一個包裝函數的函數,在函數運行時增加功能但不影響這個函數原有內容,還可以進行函數執行後的清理工作。

舉一個小例子

@func1
def func2():
    pass

裝飾器做的事情就是func1(func2) 傳遞了一個函數物件到我們的裝飾器裡面然後先執行裝飾器func1其中的內容,然後再執行函數func2

例如舉一個普通裝飾器的例子

#普通装饰器
def func1(func):
    def add_func():
        print('这是我要添加的功能')
        return func()
    return add_func

@func1
def func2():
    print('hello world')

#func1装饰器函数
#func2被装饰的函数
>>>func2()
这是我要添加的功能
hello world

在這段程式碼中func2()相當於func1(func2)()->add_func(),再想要執行func2( )函數時,先執行裝飾器func1()函數,且參數func相當於func2()。執行func1函數時由於回傳值是add_func,我們執行的是func1(func2)(),也就相當於執行add_func(),輸出
'這是我加的函數',傳回一個func()函數,也就是參數func的調用,即對應的func2函數的呼叫。

裝飾器的基本框架

def func1(func):
    def func2():

        return func()
    return func1()

進階

來一個帶有參數的裝飾器吧

def func1(func):
    def func2(a,b):
        a=1
        b=2
        return func(a,b)
    return func()
@func1
def func(x,y)
    print('this is a add func')
    print(x+y)

>>>func(10,20)
this is a add func
3

自這段程式碼中被裝飾函數的參數傳遞到裝飾函數的變數中,也就是x傳給了a,y傳給了breturn func(a,b)即呼叫了func函數且函數的參數為ab

再高階一點的裝飾函數帶參數(哈哈,是不是感覺有點懵了)

def arg_func(arg):
    def _func(func):
        def _func1():
            if arg=='good':
                print('出去玩')
            if arg=='bad':
                print('不出去玩')
            return func()
        return _func1
    return _func

@arg_func('bad')
def func():
    print('bad day')
@arg_func('good')
def func1()
    print('good day')

>>>func()
不出去玩
bad day
>>>func1()
出去玩
good day

這段程式碼其實很簡單,就是裝飾器多了一個參數用來判斷,看上去也很好理解。同樣,執行func裝飾器接收函數(arg_func)的參數是bad,執行func1函數,裝飾器接收函數的參數是good

以上是python裝飾器是什麼?怎麼用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除

相關文章

看更多