什么是装饰器

# 概念:就是接受一个函数不改变里面的代码,进行包裹,然后返回函数的一个工具;不改变原函数调用方法的,对原函数进行包裹附加功能的工具
# 原理:利用高阶函数可以接受函数作为参数,返回函数作为结果实现迭代器
# 功能:极大的简化代码,避免编写重复性代码函数
# 本质:高阶函数# @装饰器名字:等价于 f = decorate(f)。
# *args-**kw:要让 @log 自适应任何参数定义的函数,可以利用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用。# 打印日志:@log
# 用户验证:@auth
# 检测性能:@performance
# 数据库事务:@transaction
# URL路由:@post('/register')

无参数装饰器:就是没有参数的装饰器,一般两层包裹

# 无参数装饰器,
# 由于decorator返回的新函数函数名已经不是'factorial',而是@log内部定义的'wrapper'。
# 这对于那些依赖函数名的代码就会失效。decorator还改变了函数的 __name__,__doc__等其它属性。
# 如果要让调用者看不出一个函数经过了@decorator的“改造”,就需要把原函数的一些属性复制到新函数中:
# Python内置的functools可以用来自动化完成这个“复制”的任务:
def log(f):def wrapper(*args,**kwargs):ret = f(*args,**kwargs)print("call "+f.__name__)return retreturn wrapper
@log
def factorial(n):return reduce(lambda x,y:x*y,range(1,n+1))result = factorial(3)
print('result',result)f = log(factorial)(3)
print('f',f)# 打印执行时间
import time
def performance(f):def wrapper(*args,**kwargs):start = time.time()ret = f(*args,**kwargs)end = time.time()print('call %s() in %f'%(f.__name__,end-start))return retreturn wrapper@performance
def factorial(n):return reduce(lambda x,y: x*y, range(1, n+1))print(factorial(10))

  

有参装饰器:就是有参数的装饰器,一般三层包裹

# 有参数装饰器,三层函数
def log1(n):print(n*1000)def outer(f):def wrapper(*args,**kwargs):ret = f(*args,**kwargs)print("call "+f.__name__)return retreturn wrapperreturn outer
@log1(8)
def factorial(n):return reduce(lambda x,y:x*y,range(1,n+1))result = factorial(3)
print(result)f = log1(8)(factorial)(3)
print(f)# 内部返回函数名(参数),返回函数名,返回函数名
# 以下是返回的__name__
import time, functools# 没有加@functools.wraps(f):
def performance(unit):def f(f):def wrapper(*args, **kwargs):t1 = time.time()ret = f(*args, **kwargs)t2 = time.time()if unit == 's':print("call %s() in %s" % (f.__name__, t2 - t1))else:print("call %s() in %s" % (f.__name__, 1000 * (t2 - t1)))return retreturn wrapperreturn f
@performance('ms')
def factorial(n):return reduce(lambda x, y: x * y, range(1, n + 1))
print("没有加@functools.wraps(f):",factorial.__name__)# 有加@functools.wraps(f):
def performance(unit):def f(f):@functools.wraps(f)def wrapper(*args, **kwargs):t1 = time.time()ret = f(*args, **kwargs)t2 = time.time()if unit == 's':print("call %s() in %s" % (f.__name__, t2 - t1))else:print("call %s() in %s" % (f.__name__, 1000 * (t2 - t1)))return retreturn wrapperreturn f
@performance('ms')
def factorial(n):return reduce(lambda x, y: x * y, range(1, n + 1))
print("有加@functools.wraps(f):",factorial.__name__)
# 就是在里面的函数外加个@functools.wraps(函数名的参数名)

  

如何使用两种:原函数和新装饰器函数

def outer(f):def wrapper(*args,**kwargs):ret=f(*args,**kwargs)print("hello2:",*args)return retreturn wrapper@outer
def foo(name):print("hello:",name)
foo("adamanter")def wrapper(fn):def inner():print("wrapped")fn()inner.raw = fnreturn inner@wrapper
def foo():print("go")if __name__ == '__main__':# 被装饰的foo()print("--------")# 没被装饰的foo.raw()

  

转载于:https://www.cnblogs.com/adamans/articles/7495523.html

python基础-装饰器相关推荐

  1. python基础装饰器_Python基础 装饰器及练习

    Python视频教程讲解装饰器 推荐免费:Python视频教程 装饰器概念 装饰器,说白了,就是用来装饰函数的一个函数. 装饰器遵循 开放封闭原则.依赖倒置原则,这两个原则概念,自行百度下, 装饰器长 ...

  2. python修饰器classmate_[python基础]装饰器、迭代器、生成器

    装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象 它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理. ...

  3. day5学python 基础+装饰器内容

    基础+装饰器内容 递归特性# 1.必须有一个明确的结束条件# 2.每次进入更深一层递归时,问题规模相比上次递归应有所减少# 3.递归效率不高 def run(n):print(n)if int(n/2 ...

  4. python基础装饰器(二十)

    简单装饰器的代码展示: def test1(x):return x * xdef test2(x):return x + 2 * xdef demo(f):def test(x):print(f.__ ...

  5. Python之装饰器

    Python之装饰器 在不修改函数调用方式的前提下,也不能修改函数内部源代码!!!! 例如: 在每个季度公司发绩效,统计每个人的代码执行效率.咱们总不能是每个函数里加time模块吧. import t ...

  6. Python的装饰器

    详解Python的装饰器 本文源码 https://github.com/tobyqin/python_decorator Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都 ...

  7. python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景

    装饰器的应用场景附加功能 数据的清理或添加:函数参数类型验证 @require_ints 类似请求前拦截数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改为函数提供额外的数据 moc ...

  8. python装饰器函数-Python精进-装饰器与函数对象

    本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...

  9. python turtle画气球-如何用python的装饰器定义一个像C++一样的强

    如何用python的装饰器定义一个像C++一样的强 Python作为一个动态的脚本语言,其函数在定义时是不需要指出参数的类型,也不需要指出函数是否有返回值.使用python的装饰器来定义一个像C++那 ...

  10. python装饰器函数-Python函数装饰器常见使用方法实例详解

    本文实例讲述了Python函数装饰器常见使用方法.分享给大家供大家参考,具体如下: 一.装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所 ...

最新文章

  1. sketch如何做设计稿交互_做交互设计不可不知的十大原则
  2. go语言笔记——多值函数,本质上和nodejs的回调很像,不过nodejs是回调的第一个参数是err,而golang里是第二个!...
  3. 安徽大学大一高数第二章习题册答案
  4. 数据结构实验之二叉树三:统计叶子数
  5. android除去标题栏或全屏
  6. Android教程之android平台水波效果!提供源码!
  7. 深度推荐系统2019年度阅读收藏清单
  8. 计算机组成原理 多级中断,计算机组成原理的大神们能不能帮忙做几道题啊
  9. mysql_连接查询
  10. moxa串口服务器网页版用户名密码,moxa串口服务器设置密码
  11. HttpStatus详解
  12. 视频像素、分辨率、清晰度关系及区别
  13. uni-app 常用内容
  14. 关于Java八种原始数据类型
  15. 火箭双杀尼克斯 哈林组合和砍50分
  16. 『淘宝十年技术路』读后想法
  17. 【WPF、UWP】搜索蓝牙设备
  18. 计算机在制造业中的应用领域是什么,计算机在制造业中的应用ppt
  19. C++实现X11桌面录屏为H264文件
  20. 硬盘突然变raw格式_磁盘分区变成RAW格式怎么办?手把手教你解决方法

热门文章

  1. 从零开始学习jQuery (三) 管理jQuery包装集
  2. 怎么样才算是精通 Python?
  3. Matlab画图,去掉周围白边
  4. 高等数学:第六章 定积分的应用(1)定积分的应用 平面图形的面积 立体体积
  5. 中国计算机学会CCF推荐国际学术会议和期刊目录-计算机图形学与多媒体
  6. 数字图像处理:第九章 线性系统、卷积、傅立叶变换
  7. 编程之美-斐波那契(Fibonacci)数列方法整理
  8. 信息系统项目管理师历年论文题目
  9. Spring Boot 单元测试二三事
  10. 按照linux文件出现的时间来删除文件