1、定义:

(1)装饰器指的是为被装饰对象添加额外功能的工具/函数。

2、使用装饰器的意义(原因):

如果我们已经上线了一个项目,我们需要修改某一个方法,但是我们不想修改方法的使用方法,这个时 候可以使用装饰器。因为软件的维护应该遵循开放封闭原则,即软件一旦上线运行后,软件的维护对修改源代码是封闭的,对扩展功能指的是开放的。

3、装饰器的实现必须遵循两大原则:

  1. 封闭: 对已经实现的功能代码块封闭。 不修改被装饰对象的源代码
  2. 开放: 对扩展开发 装饰器其实就是在遵循以上两个原则的前提下为被装饰对象添加新功能。

4、如何实现装饰器?

装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。

*******饰器的通用模板*******(很重要)

from functools import wrapsdef function(func): #func===被装饰的函数@wraps(func) #保留被装饰函数的名字和帮助文档def wrapper(*args, **kwargs): #形参,可变参数(元组),关键字参数(字典)"""被装饰函数前需要添加的内容"""result = func(*args, **kwargs) # 实参,解包"""被装饰函数后需要添加的内容"""return resultreturn wrapper

5、装饰器的应用场景:

装饰器经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、 权限校验等应用场景。

装饰器典型应用场景:

Django框架装饰器应用:http://y.tsutsumi.io/dry-principles-through-python-decorators.html

(1)插入日志

from functools import wraps# 定义装饰器
def logger(func):"""插入日志的装饰器"""@wraps(func)def wrapper(*args, **kwargs):print("函数%s开始执行" % (func.__name__))result = func(*args, **kwargs)print("函数%s执行结束" % (func.__name__))return resultreturn wrapper# 使用装饰器
@logger  # 语法糖 执行: login = logger(login) 将login通过logger函数进行装饰,返回wrapper
def login(username, password):if username == 'root' and password == '123':print('login ok')print('%s login ok' % (username))else:print('login failed')print('%s login failed' % (username))if __name__ == '__main__':login('root', '123')   # 实质执行的是wrapper函数
# ---- 运行结果-----
# 函数login开始执行
# login ok
# root login ok
# 函数login执行结束  

(2)性能测试

比如:计算代码运行时间

from functools import  wraps
import timedef timeit(func):   # 2   func=download_music"""打印被装饰函数运行总时间的装饰器"""# @wraps保留被装饰函数的函数名和帮助文档, 否则是wrapper的信息.@wraps(func)def wrapper(*args, **kwargs):   # 5     args=('Music', ), kwargs={}start_time = time.time()result = func(*args, **kwargs)  # 6 func('Music')=download_music('Music')end_time = time.time()print("%s函数运行总时间为%fs" %(func.__name__, end_time-start_time))return  result                  # 7return  wrapper     # 3@timeit         # 1 @timeit实质上执行的内容: download_music = timeit(download_music) = wrapper
def download_music(name):   # 7time.sleep(0.4)print('[Download]: ', name)return  True# 调用download_music函数时实质上调用的是wrapper函数。
download_music('Music') # 4

运行结果:

[Download]:  Music
download_music函数运行总时间为0.420078s

参考自https://blog.csdn.net/daidadeguaiguai/article/details/103672492

Python 装饰器理解相关推荐

  1. python装饰器-理解Python装饰器(Decorator)

    理解Python装饰器(Decorator) Python装饰器看起来类似Java中的注解,然鹅和注解并不相同,不过同样能够实现面向切面编程. 想要理解Python中的装饰器,不得不先理解闭包(clo ...

  2. python装饰器理解_如何理解Python装饰器?

    首先,本垃圾文档工程师又来了.开始日常的水文写作.起因是看到这个问题如何理解Python装饰器?,正好不久前给人讲过这些,本垃圾于是又开始新的一轮辣鸡文章写作行为了. 预备知识 首先要理解装饰器,首先 ...

  3. python装饰器理解_Python装饰器理解(新手)

    本文介绍Python其中一个功能--装饰器 只做简单介绍, 可以帮助新手理解装饰器, 没有完整的装饰器代码 装饰器本质上就是一个函数,在不修改源代码,调用方法的前提下,用来给其他函数添加功能的函数 知 ...

  4. python装饰器理解_python装饰器理解

    现在我们来看看如何从一些最基础的方式来理解Python的装饰器.英文讨论参考Here. 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

  5. python装饰器原理-深刻理解python装饰器

    我们要完全理解python装饰器,不是很容易,主要归结有如下困难: 1. 关于函数"变量"(或"变量"函数)的理解 2. 关于高阶函数的理解 3. 关于嵌套函数 ...

  6. python装饰器作用-Python装饰器的通俗理解

    在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...

  7. python装饰器-如何理解Python装饰器?

    我从以下几点,由浅入深详细讲解一下Python装饰器:什么事装饰器? 为什么用装饰器? 在哪里用装饰器? 然后以示例+讲解相结合的方式阐述,同时会讲解一些在很多教程和书籍中不会涉及到的内容. 什么是P ...

  8. python装饰器原理-深入理解 Python 装饰器

    作者简介 曾凡伟,携程信息安全部高级安全工程师,2015年加入携程,主要负责安全自动化产品的设计和研发,包括各类扫描器.漏洞管理平台.安全 SaaS 平台等. Python 是一门追求优雅编程的语言, ...

  9. (一)Python装饰器的通俗理解

    在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...

最新文章

  1. android 之 Activity管理与Intent的六大属性
  2. 关于学习的一则小故事
  3. 浅谈.Net异步编程的前世今生----APM篇
  4. ASP.NET Core开发-Docker部署运行
  5. sml完整形式_411的完整形式是什么?
  6. 基于java的数据结构学习——数组实现的队列和循环队列及性能对比
  7. Lync与Exchange 2013 UM集成:Lync Server配置
  8. ansible 并发设置_如何使用Ansible通过Prometheus设置系统监视
  9. tomcat启动慢, Creation of SecureRandom instance for session ID generation using [SHA1PRNG]took [xx] mil
  10. android studio或者IntelliJ代码样式的设置
  11. B/S系统间跨域单点登录设计思路
  12. js 设置cookie
  13. 编程必备基础知识-计算机组成原理-概述篇
  14. android 发布最新系统更新包,安卓升级包(安卓补丁包更新)
  15. python入门与实战--ENS未注册域名批量查询
  16. 微信小程序 js创建Object对象
  17. 东方通TongWeb创建GBase数据库连接池
  18. php表格合并_phpword 合并单元格的坑
  19. 微信小程序和公众号开发流程
  20. 导入地形数据到pointwise中生成网格

热门文章

  1. 资金时间价值的计算机应用视频讲解,第八章资金时间价值与方案经济比选20161018讲解.ppt...
  2. 计划任务文件 linux,Linux之任务计划
  3. 扫地机器人划伤地板_扫地机器人哪个牌子好?会选的才能买到好产品
  4. 电脑上交计算机作业怎么打开,上海交大计算机第一次作业-20210711011739.docx-原创力文档...
  5. 计算机专业英语读书报告,英语读书报告怎么写
  6. java拖动图片拼图_求教,我的这个拼图程序中的移动图片的改怎么做
  7. 记一次win10下pycharm用tensorboard可视化不显示的问题解决
  8. matlab中如何表示线积分,MATLAB - 复杂的线/路径积分
  9. java 获得站点地址_JavaWeb项目里面的路径获取方法总结
  10. 用python绘制心形_python小趣味_520绘制一个心形.