本博客的内容仅为博主自己的一些理解和归纳,如有错误,欢迎指正呀~
装饰器的作用在于:不修改原函数的调用方式的情况下在原函数前后添加其他功能
装饰器是一个闭包函数,相当于是一种函数的嵌套,装饰器对扩展是开放的,对修改是封闭的
下面用一些实际例子来理解装饰器
先看一下单个装饰器的作用:
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()实现一级一级的嵌套