# 我是一个想装饰func1的函数
# def func2(func1):
# def inner():
# print('我是执行最初函数前的执行')
# func1()
# print('我是执行完原本函数后的执行')
# return inner
#
# # 装饰器
# @func2
# def func1():
# print(111111)
# print('这是我最初的函数,也就是我是最初的样子')
# func1()
"""
@func2的效果等同于func2(func1),所以直接调用func1()相当于实现了func2(func1)(),也就是也会执行inner函数 进而达到原来的效果
装饰器的本身是一个高级python函数,通过给别的函数添加@标识的形式实现对函数的装饰
装饰器的功能: 它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象,他经常用于有切面需求的场景,
比如:插入日志,性能测试,事务处理,缓存,权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离大量与函数本身无关
的雷同代码并继续重用
装饰器放在一个函数上,相当于将这个函数当成参数传递给装饰函数
"""
# 我是一个装饰器
def func_zhuang1(func1):
print("我也是装饰器,我是第二步 2")
def inner1():
print("我是装饰器内部的,我是第三步 3")
func1()
print("执行完func1再执行我,那我是第几步呢 7")
return inner1
def func_zhuang2(func1):
print("我是装饰器,我是第一步,先走我 1")
def inner2():
print("我是装饰器内部的,我是第四步 4")
func1()
print('执行完func1再执行我 6 ')
return inner2
@func_zhuang1
@func_zhuang2
def func1():
print("我是想被装饰的东西呦 5")
func1()
"""
不执行的时候出现的情况
如果是不调用func1() 直接执行python程序,不调用任何方法, 发现从上往下进行执行的时候两个装饰器里面的第一个print()方法也执行了
@func_zhuang1等同于
func1 = func_zhuang1(func1) 程序从上往下执行的时候 相当于执行了@func_zhuang1 @func_zhuang2 func1 = func_zhuang1(func1)
相当于调用了这两个函数 所以分别执行了这两个函数中的print() 这两个函数还有返回值,但是返回值是这两个函数的闭包,这里不会显示
"""
![]()
"""
调用
执行的时候出现的情况
多个装饰器装饰同一个函数的时候 先走离函数最近的装饰器 也就是由下往上的去装饰 加上@func_zhuang2 也就是此时的func1()等同于
func_zhuang2(func1)() 也就是第一层inner2() 然后加上装饰器@func_zhuang1() 此时的func1()等同于
func_zhuang1(func_zhuang2(func1))() 也就是func_zhuang1(inner2)()
然后是这样走 先把装饰器走了 先走装饰器2打印func_zhuang2(func1) 里面的第一步 1 然后走装饰器1 我是第二步 2 走inner1()但是装饰器
func_zhuang1里面传递的func1此刻就是inner2,也就是走func_zhuang1()() 也就是inner() inner1打印我是第三步调用inner2()
走inner2里面的我是装饰器内部打印第四步 然后执行最初的func1()函数 打印我是
想被装饰器装饰的东西 然后回到 调用func1的地方继续往下执行 然后再回到调用inner2的地方 执行最后一步
"""
![]()
https://blog.csdn.net/qq_26442553/article/details/82226657
一个让我比较明白的博客