Decorator-Python中的裝飾器

本博客的內容僅爲博主自己的一些理解和歸納,如有錯誤,歡迎指正呀~

裝飾器的作用在於:不修改原函數的調用方式的情況下在原函數前後添加其他功能

裝飾器是一個閉包函數,相當於是一種函數的嵌套,裝飾器對擴展是開放的,對修改是封閉的

下面用一些實際例子來理解裝飾器

先看一下單個裝飾器的作用:

def w1(func):
    print('----w1----')
    def inner():
        print('----before----')
        func()
        print('----after----')
    return inner

@w1
def f1():
    print('----f1----')
    
# 輸出:----w1----

f1()
# 輸出:----before----
#      ----f1----
#      ----after----

可以看出在整個調用過程相當於把f1()給嵌入到w1()中,用w1()代替w1()中的func(),然後執行w1()

再看下一個例子,可以進一步理解函數外部和內部的執行過程

def func(functionName):
    print("----func----1----")
    def func_in():
        print("----func_in----1----")
        functionName()
        print("----func_in----2----")

    print("----func----2----")
    return func_in

@func
def test():
    print("----test----")

#test = func(test)

test()

# 運行結果
# ----func----1----
# ----func----2----
# ----func_in----1----
# ----test----
# ----func_in----2----

可以發現,先執行內嵌函數外部的操作,然後再執行內部函數,而外部函數的執行不需要函數的調用,從上面的例子也可以看出,print(----w1----)的操作在執行f1()之前

然後看一下多個裝飾器的執行:

def a(func):
    print('i\'m a!')
    def e():
        print(1)
        func()
        print(2)
    return e
def b(func):
    print('i\'m b!')
    def d():
        print('a')
        func()
        print('b')
    return d
@b
@a
def c():
    print('!!!!!')
c()
# output:
# i'm a!
# i'm b!
# a
# 1
# !!!!!
# 2
# b

如果不使用裝飾器,可以如以下簡化

# 這裏的func()表示的是e()
def b():
    print('a')
    func()
    print('b')
   

# 這裏的func()表示的是c()
def b():
    print('a')
    print(1)
    func()
    print(2)
    print('b')

def b():
    print('a')
    print(1)
    print('!!!!!')
    print(2)
    print('b')    

可以看出相當於先把c()嵌套到a(),然後把a()嵌套到b()實現一級一級的嵌套

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