装饰器

python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)。

实质: 是一个函数。

参数:是你要装饰的函数名(并非函数调用)。

返回:是装饰完的函数名(也非函数调用)。

作用:为已经存在的对象添加额外的功能。

特点:不需要对对象做任何的代码上的变动。

python装饰器有很多经典的应用场景,比如:插入日志、性能测试、事务处理、权限校验等。装饰器是解决这类问题的绝佳设计。

装饰器最大的作用就是对于我们已经写好的程序,我们可以抽离出一些雷同的代码组建多个特定功能的装饰器,这样我们就可以针对不同的需求去使用特定的装饰器,这时因为源码去除了大量泛化的内容而使得源码具有更加清晰的逻辑。

定义一个能打印日志的decorator:

deflog(func):def wrapper(*args, **kw):print('call %s():' % func.__name__)return func(*args, **kw)returnwrapper

@logdefnow():print('2015-3-25')

调用:

now()

输出:

call now():2015-3-25

函数对象有一个__name__属性,可以拿到函数的名字。

调用now()函数,不仅会运行now()函数本身,还会在运行now()函数前打印一行日志。

把@log放到now()函数的定义处,相当于执行了语句:

now = log(now)

wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。在wrapper()函数内,首先打印日志,再紧接着调用原始函数。

如果decorator本身需要传入参数,那就需要编写一个返回decorator的高阶函数:

deflog(text):defdecorator(func):def wrapper(*args, **kw):print('%s %s():' % (text, func.__name__))return func(*args, **kw)returnwrapperreturndecorator

@log('execute')defnow():print('2015-3-25')

now()

输出:

execute now():2015-3-25

和两层嵌套的decorator相比,3层嵌套的效果是这样的:

now = log('execute')(now)

首先执行log('execute'),返回的是decorator函数,再调用返回的函数,参数是now函数,返回值最终是wrapper函数。

函数也是对象,它有__name__等属性,但你去看经过decorator装饰之后的函数,它们的__name__已经从原来的'now'变成了'wrapper':

print(now.__name__) #输出:wrapper

因为返回的那个wrapper()函数名字就是'wrapper',所以,需要把原始函数的__name__等属性复制到wrapper()函数中,否则,有些依赖函数签名的代码执行就会出错。

Python内置的functools.wraps就是干这个事的,所以,一个完整的decorator的写法如下:

importfunctoolsdeflog(func):

@functools.wraps(func)def wrapper(*args, **kw):print('call %s():' % func.__name__)return func(*args, **kw)return wrapper

importfunctoolsdeflog(text):defdecorator(func):

@functools.wraps(func)def wrapper(*args, **kw):print('%s %s():' % (text, func.__name__))return func(*args, **kw)returnwrapperreturn decorator

python装饰器函数-python3 函数:函数装饰器相关推荐

  1. Python3 range()函数

    Python3 range() 函数用法  Python3 内置函数 Python3 range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表. Pyth ...

  2. python装饰器函数-【python3】 函数 装饰器

    第一步 : 了解装饰器 装饰器模式,重点在于装饰,装饰的核心仍是被装饰的对象. 举一个栗子:我今天穿了一件短袖,但是突然一阵风,短袖没办法为我御寒,我想到的办法是将短袖变得更厚更长,但是改造之后,它就 ...

  3. python高阶函数闭包装饰器_Python自学从入门到就业之高阶函数、嵌套函数、闭包、装饰器...

    高阶函数 在Python中,函数其实也是一种数据类型. def test(): return 'hello world' print(type(test)) # 函数对应的数据类型是 function ...

  4. python中的json函数_python中装饰器、内置函数、json的详解

    装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...

  5. python装饰器 稀里糊涂_万恶之源 - Python装饰器及内置函数

    装饰器 听名字应该知道这是一个装饰的东西,我们今天就来讲解一下装饰器,有的铁子们应该听说,有的没有听说过.没有关系我告诉你们这是一个很神奇的东西 这个有多神奇呢? 我们先来复习一下闭包 def fun ...

  6. python function at 0x00000_Python 中的函数装饰器和闭包

    本文是<流畅的Python>第7章的学习笔记. 函数装饰器可以被用于增强方法的某些行为,如果想自己实现装饰器,则必须了解闭包的概念. 装饰器的基本概念 装饰器是一个可调用对象,它的参数是另 ...

  7. Python装饰器是什么?使用Python装饰器实现计算程序(函数)运行时间的功能

    Python装饰器是什么?使用Python装饰器实现计算程序(函数)运行时间的功能 目录

  8. python高阶函数闭包装饰器_Python_基础_(装饰器,*args,**kwargs,高阶函数,函数闭包,函数嵌套)...

    一,装饰器 装饰器:本质就是函数,功能是为其它的函数动态添加附加的功能 原则:对修改关闭对扩展开放 1.不修改被修饰函数的源代码 2.不修改被修改函数的调用方式 装饰器实现的知识储备:高阶函数,函数嵌 ...

  9. python 装饰器 参数-python函数装饰器之带参数的函数和带参数的装饰器用法示例...

    本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法.分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def decrator(fun ...

最新文章

  1. 终于明白了 DevOps 与 SRE 的区别!
  2. 无偏估计【统计学-通俗解释】
  3. Upgrade Hole puncher Mathematical Modeling
  4. python常用的装饰器库_Python中的各种装饰器详解
  5. 打印字符(信息学奥赛一本通-T1021)
  6. 细数SkyEye异构仿真的5大特色
  7. Tesseract-OCR图片识别为文字
  8. 关于spring mvc时间类型绑定失败解决方法
  9. 虚拟linux无线网卡驱动安装失败,救命1 :Atheros AR5212无线网卡驱动安装失败!!...
  10. jsf教程_JSF教程
  11. buck变换器设计matlab_电力电子变换器控制设计(1)
  12. 数据结构和算法常见面试题大全
  13. CV领域的实验室及研究组
  14. 10.机器学习sklearn-------手写数字识别实例
  15. 《计算机网络实验》网络参数配置与常用网络命令使用,超级详细教程
  16. 计算机硬件数据统计实验报告,实验二数据统计01
  17. 食物链 (利用并查集的两种解决方法)
  18. UG NX 12 草图设计
  19. 【整理】MySQL引擎
  20. Chrome模拟企业微信环境

热门文章

  1. 导入外部项目无法识别为Web项目无法部署到tomcat
  2. Swift的数组与OC中数组的区别
  3. [WebApp开发]基础教程-Google官方文档-第四篇
  4. Balder 3D开发系列之--创建天空盒
  5. Unable to load native-hadoop library for your platform... using builtin-java classes where applica
  6. JQuery3 的新变化
  7. HTML5中的Article和Section元素
  8. Mongodb的Replica Sets + Sharding架构
  9. 想学python都要下载什么软件-学编程闲余时间建议下载的软件_Python新手入门教程...
  10. python关闭读写的所有的文件-python文件读写操作