博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python-函数-装饰器
阅读量:7121 次
发布时间:2019-06-28

本文共 1090 字,大约阅读时间需要 3 分钟。

hot3.png

装饰器:  为被装饰的对象(函数或类)增加新的功能或者附加限制条件或者帮助输出

def outer(func):#装饰器函数(对真正装饰器进行了封装防止函数还没调用就已经被执行)    def inner():        print("认证成功!")        result = func()#调用旧函数。        print("日志添加成功")        return result    return inner#返回的是函数体覆盖f1.(f1 = inner)@outer #装饰器名称def f1():#被装饰的函数    print("业务部门1数据接口......")结果:认证成功!业务部门1数据接口......日志添加成功

注意:

  • 装饰器规则是: @装饰器名,放在被装饰对象上面装饰器装饰过程:被装饰的函数的名字会被当作参数传递给装饰函数。装饰函数执行它自己内部的代码后,会将它的返回值赋值给被装饰的函数。1:f1这个函数名(而不是f1()这样被调用后)当做参数传递给装饰函数outer,也就是:func = f1,@outer等于outer(f1),实际上传递了f1的函数体,而不是执行f1后的返回值.2:f1当做参数传递给func这个形参,func这个变量保存了老的函数在内存中的地址,通过它就可以执行老的函数体。3:outer函数return的是inner这个函数名,而不是inner()这样被调用后的返回值.return 返回值是个函数名inner,并且这个函数名会被赋值给f1这个被装饰的函数,也就是f1 = inner(实际上是f1这个函数名更改成指向inner这个函数名指向的函数体内存地址,f1不再指向它原来的函数体的内存地址)4:@outer这句代码在程序执行到这里的时候就会自动执行outer函数内部的代码,如果不封装一下,在业务部门还未进行调用的时候,就执行了,这和初衷不符。如:
  • def outer(func):    print("认证成功!")    result = func()    print("日志添加成功")    return result@outerdef f1():    print("业务部门1数据接口......")# 业务部门并没有调用f1函数------------------------------------------执行结果:认证成功!业务部门1数据接口......日志添加成功

转载于:https://my.oschina.net/wangyunlong/blog/3014892

你可能感兴趣的文章
三元表达式
查看>>
解决苹果手机返回不刷新问题
查看>>
非常实用的Android Studio快捷键
查看>>
怎样在SQL Server上部署SSIS包 2
查看>>
记OC迁移至swift中笔记20tips
查看>>
C# ToString格式字符串整理(Format)(数字、日期和枚举的标准格式设置说明符)
查看>>
VS2010中的顺序图
查看>>
Django 初识
查看>>
第二阶段个人总结10
查看>>
su,sudo
查看>>
用pyqt5做一个能python程序能插入图片的ide
查看>>
mysql学习(2)-Navicat Premium 12 链接MySQL8.0.11数据库报2059错误
查看>>
asp.net中GridView多行表头导出Excel表头显示不全问题解决方法
查看>>
mathnet杂记
查看>>
Wpf 简单制作自己的窗体样式
查看>>
HDU1693 Eat The Trees(插头dp)
查看>>
Unity 可重复随机数
查看>>
unity基础开发----Unity获取PC,Ios系统的mac地址等信息
查看>>
compile error
查看>>
nodejs总结之redis模块
查看>>