本博客的內容僅爲博主自己的一些理解和歸納,如有錯誤,歡迎指正呀~
裝飾器的作用在於:不修改原函數的調用方式的情況下在原函數前後添加其他功能
裝飾器是一個閉包函數,相當於是一種函數的嵌套,裝飾器對擴展是開放的,對修改是封閉的
下面用一些實際例子來理解裝飾器
先看一下單個裝飾器的作用:
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()實現一級一級的嵌套