python装饰器
  X5zJxoD00Cah 2023年11月02日 25 0

https://mp.weixin.qq.com/s/-tr_OP46vdMU06E6LE3H1A

'''
1   将outer 定义代码块读入内存中, 没有调用outer()

2   解释装饰器的作用
2.1 立即执行作为装饰器的函数outer(被装饰的函数名)
2.2 被装饰的函数名f1 作为参数被传递给装饰函数outer(f1)

3   解释2 装饰器的注意事项
3.1 装饰函数无论有无() 都会执行
3.2 装饰函数里的参数必须是函数名, 传递f1 的函数体

4   调用outer(f1)
4.1 将inner 定义代码块读入内存中, 没有调用inner()
4.2 返回函数名inner

5   函数名inner 将被赋值给函数名f1, 即f1= inner
5.1 此时函数f1 被函数inner 覆盖
5.2 其实是函数名f1 被修改为指向函数名innner 所指向的函数体的内存地址

6   再调用f1() 将执行inner()
6.1 而f1 初始的函数体 被保存在装饰函数outer(func)的参数func中
6.2 通过result= func() 将执行f1 初始的函数体

7   解释6 再调用f1() 将执行inner() 其执行过程如下
7.1 print("认证成功!")
7.2 调用fun() 即调用f1() 初始的函数体, 将其返回值赋值给变量result
7.3 print("日志添加成功")
7.4 返回变量result 即调用f1() 初始的函数体, 将其返回值返回

8   简要总结
8.1 将outer 定义代码块读入内存中, 没有调用outer()
8.2 立即执行装饰器outer(f1) 返回函数名inner 将其赋值给函数名f1 即f1= inner
8.3 调用f1() 其实是调用inner()
8.4 inner() 内调用f1() 初始的函数体, 将其返回值赋值给变量result
8.5 返回变量result 即调用f1() 初始的函数体, 将其返回值返回

9   inner()执行过程展示
9.1 print("认证成功!")
9.2 调用f1() 初始的函数体, 将其返回值赋值给变量result
9.3 print("日志添加成功")
9.4 返回变量result

10   最终效果展示
10.1 print("认证成功!")
10.2 print("日志添加成功")
10.3 返回 调用f1() 初始的函数体
'''
# 基础平台部门开发了上百个函数API
def f1():
    print("业务部门1的数据接口......")
def f2():
    print("业务部门2的数据接口......")
def f3():
    print("业务部门3的数据接口......")
def f100():
    print("业务部门100的数据接口......")

#各部门分别调用自己需要的API
f1()
f2()
f3()
f100()
def outer(func): # 函数名作为参数 而不是调用函数() 将其返回值作为参数
    def inner():
        print("认证成功!")
        result = func() # 调用func() 将其返回值赋值给result
        print("日志添加成功")
        return result # 返回result
    return inner # 返回inner函数 而不是调用inner() 将其返回值返回

@outer # 无论有无() outer都会执行
def f1():
    print("业务部门1数据接口......")

@outer
def f2():
    print("业务部门2数据接口......")
@outer
def f3():
    print("业务部门3数据接口......")

@outer
def f100():
    print("业务部门100数据接口......")

#各部门分别调用
f1()
f2()
f3()
f100()

@ 符号就是装饰器的语法糖,它放在函数开始定义的地方,这样就可以省略最后一步再次赋值的操作。

https://foofish.net/python-decorator.html


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  zLxnEsMLk4BL   2023年11月19日   32   0   0 赋值运算符字符串
  X5zJxoD00Cah   2023年11月02日   48   0   0 赋值
  zLxnEsMLk4BL   2023年11月19日   32   0   0 赋值字符串bc
X5zJxoD00Cah