python裝飾器

原文地址

https:nolon.xyz

在學習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

好了,到這裏,裝飾器的內容基本上就梳理完了,肯定還有不全的地方或者不好的地方,希望小夥伴們可以多多完善,有需要補充的或者需要改正的在下面留言告訴我哦 ( •̀ ω •́ )y!

文章地址:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章