直接代码+图片,来介绍。简单粗暴。
def out1(f):
print('1层')
f()
def insaid():
print('2层')
return insaid
@out1
def func_b():
print('函数B')
func_b() # 调用函数
这个图和代码含义:(运行结果:图右上角白字部分,有些小)
首先看运行顺序,在逐个展开。
一、装饰器@out1,最先运行。所谓【装饰】,就是在最外层的,比方说:人的耳环,帽子,戒指等,都在人体最外层。根据python语言特点从上往下,从外到内依次运行——所以,装饰器最先运行的。
func_b=out1(func_b)就是把func_b放入了def out1(f)这个内存中了。
为啥没有先打印 "函数B" 这个词?
python语言特点:从上到下依次运行.必须先从def out1(f)从上到下依次运行。如果把f()放在,print(‘1层’)上面,那就先执行print“函数B”。
f()是关键:f()它就是def func_b, func_b变成了def out1:函数的参数了。
装饰器:
1不修改已有函数的代码
2不修改已有函数的的调用方式
3给已有函数增加额外功能。
不加装饰器@out1,运行结果和原来一样。调用方式也一样。
调用时增加了func_b=out1(func_b)
这个代码等于func_b=out1(func_b)等同于@out1
加不加装饰器,调用方式都是 func_b() # 调用函数
def out1(f):
print('1层')
f()
def insaid():
print('2层')
return insaid
def func_b():
print('函数B')
func_b=out1(func_b)
func_b() # 调用函数
这是装饰器运行的简单原理。
例如:带参数的装饰器、多个装饰器等等。
弄懂了这个图,学其他的装饰器就心中有底了。
一切皆对像。