首页 > 编程语言 >python装饰器

python装饰器

时间:2023-06-09 18:03:59浏览次数:50  
标签:f1 调用 outer 函数 python inner print 装饰


'''
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


标签:f1,调用,outer,函数,python,inner,print,装饰
From: https://blog.51cto.com/u_16055028/6449686

相关文章

  • 实验六 实验6 turtle绘图与python库应用编程体验
    task1_1源代码:fromturtleimport*defmove(x,y):'''画笔移动到坐标(x,y)处'''penup()goto(x,y)pendown()defdraw(n,size=100):'''绘制边长为size的正n变形'''foriinrange(n):......
  • Python 元组
    Tuple数据类型一、如何创建元组>>>t=(1,2,3,'root')>>>t(1,2,3,'root')二、元组和列表的区别list是一种有序的集合,可以随时添加和删除其中的元素。元组也是一种有序列表,和list非常类似,不同点是tuple一旦定义了就不可修改,在一定意义上这也提高了代码的安全性......
  • python-类作为装饰器的各种情况
    1.装饰器没有参数:这时foo不再是之前的函数名而是类ClassDeco的一个对象,并且foo.func=foo,对象名()会触发类ClassDeco的__call__方法:classClassDeco:def__init__(self,func):self.func=funcdef__call__(self,*args,**kwargs):print(f'Runni......
  • Python 用户登录程序
    用户登录程序任务内容1、输入用户名和密码2、认证成功后显示欢迎信息3、输错3次后锁定流程图代码1、主文件importsyslock="lock.txt"logfile="login.txt"login_info=0i=0whilei<3andlogin_info==0:name=input("Pleaseinputyourname......
  • python selenium 模拟实现滑块验证码
    canndy_test.pyimportcv2importnumpyasnpdefmatchImg(imgPath1,imgPath2):imgs=[]#原始图像,用于展示sou_img1=cv2.imread(imgPath1)sou_img2=cv2.imread(imgPath2)#原始图像,灰度#最小阈值100,最大阈值500img1=cv2......
  • Python程序与设计
    2-27在命令行窗口中启动的Python解释器中实现在Python自带的IDLE中实现print("Helloworld")编码规范每个import语句只导入一个模块,尽量避免一次导入多个模块不要在行尾添加分号“:”,也不要用分号将两条命令放在同一行建议每行不超过80个字符使用必要的空行可以增加代码的可读性运算......
  • python3-类的专有方法
    1、介绍专有方法,具有私有方法的特性,即只能在类中被调用,是编程语言所准备的特殊作用的方法。2、方法说明2.1__init__构造方法,在对象创建时被调用。可以在方法中声明对象属性,以及其它初始化操作2.2__del__删除方法,当对象被释放时调用,可以在其中写一些对象结束时操作的代码......
  • python010 控制多台同类型设备
    defauto_find():rm=pyvisa.ResourceManager()devices=rm.list_resources()print(devices)ins_dict={'p1':None,'p2':None,'m1':None,'m2':None}counts={'p1':0,'p2'......
  • python gunicorn详解
    Gunicorn是一个unix上被广泛使用的高性能的PythonWSGIUNIXHTTPServer。和大多数的web框架(flask)兼容,并具有实现简单,轻量级,高性能等特点。 通过Gunicorn来启动flask框架defstart_app_by_system(args,app,options):"""启动配置项:paramargs:参数......
  • Python List
    List数据类型一、创建一个列表用把逗号分隔的不同的数据项使用方括号括起来即可。如下所示:>>>name_list=["root","gm","hlr"]二、访问列表中的值使用下标索引来访问列表中的值,与字符串的索引一样,列表索引从0开始。列表可以进行截取、组合等。>>>name_list['root',......