Python进阶(六)----装饰器

一丶开放封闭原则

开放原则:

​ 增加一些额外的新功能

封闭原则:

​ 不改变源码.以及调用方式

二丶初识装饰器

装饰器:

​ 也可称装饰器函数,诠释开放封闭原则,装饰器的本质是闭包

  1. ###普通版装饰器
  2. import time
  3. def timmer(x): # x 接收的原函数的内存地址
  4. def inner():
  5. start_time=time.time()
  6. x() # 执行 原函数
  7. print(f'执行效率{time.time()-start_time}')
  8. return inner
  9. def index():
  10. time.sleep(2)
  11. print(f'欢迎访问本站博客园')
  12. index=timmer(index) #将timmer函数执行的结果返回,付给index变量
  13. index() #这里执行的inner函数
  14. ###标准版 @timmer是语法糖(黏贴在被装饰函数,先于执行被装饰函数),装饰器函数必写在被装饰函数之上.
  15. import time
  16. def timmer(func): # 此时 func 就是一个自由变量
  17. def inner():
  18. start_time = time.time()
  19. func() # func 是timmer函数传递过来的index原函数的内存地址
  20. print(f'执行效率 {time.time() - start_time}')
  21. return inner
  22. @timmer # 等同于 index=timmer(index) 往下读一行
  23. def index():
  24. time.sleep(2)
  25. print('登录成功')
  26. index() #这里执行的inner函数

三丶被装饰函数带返回值

  1. ###需求被装饰函数有返回值
  2. import time
  3. def timmer(func): # 这里argv 接收的真正要执行的原函数.
  4. def inner():
  5. start_time=time.time()
  6. var=func()
  7. print(f'{time.time()-start_time},{args[0]},{args[1]}')
  8. return var #原函数有返回值, 这里是执行完 inner函数 中真正要返回的原函数执行的结果
  9. return inner
  10. @timmer
  11. def index(*args,**kwargs):
  12. time.sleep(2)
  13. print('进入到网页index页面')
  14. return True # 原函数 最重返回的结果是 True
  15. print(index(1,2)) # 这里是执行 inner方法

四丶被装饰函数带参数

  1. ###需求 被装饰函数有参数
  2. import time
  3. def timmer(func):
  4. def inner(*args,**kwargs): # inner方法执行,接收的参数, 将形参参数聚合 args=(1,2)
  5. # 函数定义时 , * ,** 代表聚合
  6. start_time=time.time()
  7. res=func(*args,**kwargs) # 执行真正的原函数, 将参数打散 func(1,2)
  8. # 函数执行时 ,* ,** 代表打散
  9. print(f'{time.time()-start_time} 这是{args[0]}')
  10. return res
  11. return inner
  12. @timmer
  13. def index(args):
  14. time.sleep(2)
  15. print(f'welcome {args}')
  16. return True
  17. index('都来看')

五丶标准终终结版装饰器

  1. ###### 装饰器原版 ####
  2. def warpper(func):
  3. def inner(*args,**kwargs):
  4. '''被装饰器之前的操作'''
  5. ret=func(*args,**kwargs)
  6. '''被装饰函数之后的操作'''
  7. return ret
  8. return inner
  9. ####拓展版 计算index函数执行的效率
  10. import time
  11. def timmer(func):
  12. def inner(*args,**kwargs): # inner方法执行,接收的参数, 将形参参数聚合 args=(1,2)
  13. # 函数定义时 , * ,** 代表聚合
  14. start_time=time.time()
  15. res=func(*args,**kwargs) # 执行真正的原函数, 将参数打散 func(1,2)
  16. # 函数执行时 ,* ,** 代表打散
  17. print(f'{time.time()-start_time} 这是{args[0]}')
  18. return res #原函数有返回值, 这里是执行完 inner函数 中真正要返回的原函数执行的结果
  19. return inner #返回inner函数, 给index重新赋值.
  20. @timmer #语法糖,等同于 index=timmer(index) , 把index原函数作为形参传递给timmer函数func
  21. def index(args): # 原函数具有传参的功能
  22. time.sleep(2)
  23. print(f'welcome {args}')
  24. return True # 原函数具有返回值的功能
  25. index('都来看') # 执行的是inner函数,把参数传递给inner函数,
  26. ####装饰器:
  27. #1.必须存在嵌套函数中
  28. #2.必须存在内存函数对外层函数(非全局变量)的引用
  29. #3.必须具有return 返回嵌套函数的内存地址(嵌套函数名字)
  30. #4.内层函数必须能够接收原函数传递的参数
  31. #5.内存函数执行完必须返回原函数要返回的结果
  32. ####装饰器约束:
  33. #1.不得更改源码,
  34. #2.不能更改调用方式
  35. ####应用场景:
  36. #用户登录验证
  37. #打印日志

Python进阶(六)----装饰器的更多相关文章

  1. python进阶04 装饰器、描述器、常用内置装饰器

    python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...

  2. Python进阶之装饰器

    函数也是对象 要理解Python装饰器,首先要明白在Python中,函数也是一种对象,因此可以把定义函数时的函数名看作是函数对象的一个引用.既然是引用,因此可以将函数赋值给一个变量,也可以把函数作为一 ...

  3. Python进阶: Decorator 装饰器你太美

    函数 -> 装饰器 函数的4个核心概念 1.函数可以赋与变量 def func(message): print('Got a message: {}'.format(message)) send ...

  4. python进阶(三)~~~装饰器和闭包

    一.闭包 满足条件: 1. 函数内嵌套一个函数: 2.外层函数的返回值是内层函数的函数名: 3.内层嵌套函数对外部作用域有一个非全局变量的引用: def func(): print("=== ...

  5. [Python进阶]002.装饰器(1)

    装饰器(1) 介绍 HelloWorld 需求 使用函数式编程 加入装饰器 解析 介绍 Python的装饰器叫Decorator,就是对一个模块做装饰. 作用: 为已存在的对象添加额外功能. 与Jav ...

  6. python进阶:装饰器

    1.闭包 简单理解:闭包就是多层函数的嵌套,外层函数的返回值是内层函数的引用. def out_func(n): num = 100 def in_fucn(*args,**kwargs): # no ...

  7. Python进阶(装饰器)

    from datetime import datetime def log(func):#func表示装饰器作用于的函数 def wrapper(*args,**kw):#wrapper返回装饰器作用 ...

  8. Noah的学习笔记之Python篇:装饰器

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  9. 简单说明Python中的装饰器的用法

    简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下   装饰器对与 ...

随机推荐

  1. 考勤打卡机导出的excel考勤时间表如何生成实用的考勤表

    该excel表有如下结构 姓名\日期 周1 周2 周3 周4 周5 张三 7:3518:02 7:3518:02 7:46   17:56 李四 7:3518:02 7:02 18:00 18:02 ...

  2. 基于springboot+jquery+H5的文件(并发+断点+分片)的上传方案

    1.支持文件分片断点续传 2.支持已上传文件再次上传时秒传 3.多个人对同一个文件同时上传可以多线程并发协调上传,加快超大文件的上传速度. 技术点:springboot + webflux + red ...

  3. github加速

    访问 https://www.ipaddress.com/ 找到以下网址对应的ip,在本地hosts里面映射,或者到路由器内映射好即可. github.com assets-cdn.github.co ...

  4. java.lang.ClassNotFoundException: com.*.*.entity.time.Q*

    @Entity 实体类 java.lang.ClassNotFoundException: com.*.*.entity.time.Q* 添加依赖 1.添加DSL依赖 <!--query dsl ...

  5. a dynamic resume

    介绍 发现一款开源的动画简历工程, 很是吸引眼球, 分享出来. 技术: 1. npm工程管理 2. vuejs 设计上,将工程分为两个组件: 0.程序入口组件 1. 编辑器组件 2. 简历展示组件 流 ...

  6. 工控随笔_25_西门子TIA 博图V14.SP1安装报错,授权错误

    前面有一篇文章说过西门子的软件安装的时候太麻烦,很容易出现错误. 但是有些错误在安装的时候却没有关系,例如下面的错误. 如上图所示,安装已经到最后一步,总结前面的修改系统组态已经打勾(✔) ,而且提示 ...

  7. 【计算机视觉】OpenCV篇(10) - 模式识别中的模板匹配

    什么是模式识别? 它指的是,对表征事物或现象的各种形式的信息进行处理和分析,从而达到对事物或现象进行描述.辨认.分类和解释的目的. 我们之所以可以很快辨别猫是猫.O不是0,就是因为在我们大脑中已经给猫 ...

  8. DL Practice:Cifar 10分类

    Step 1:数据加载和处理 一般使用深度学习框架会经过下面几个流程: 模型定义(包括损失函数的选择)——>数据处理和加载——>训练(可能包括训练过程可视化)——>测试 所以自己写代 ...

  9. MySQL5.7修改wait_timeout参数

    参考:https://blog.csdn.net/ivory_town1/article/details/77702357 1.修改参数配置文件 vi /etc/my.cnf [mysqld] wai ...

  10. 工具分享:excel2json,将Excel表格转换为JSON

    此次分享的是github上的一个开源小工具:excel2json,用于把Excel表转换成json对象,并保存到一个文本文件. 项目地址:https://github.com/neil3d/excel ...