装饰器本身是一个函数。

需求:在下面返回时间的函数前面都在开头加上:当地时间

import time
def getXXXTime():print()return time.strftime('%Y_%m_%d %H:%M:%S',time.localtime())

这时候,我们完全可以不去修改原来的函数,而是使用装饰器,如下

import time# 定义一个装饰器函数
def sayLocal(func):def wrapper():curTime = func()return f'当地时间: {curTime}'return wrapperdef getXXXTime():return time.strftime('%Y_%m_%d %H:%M:%S',time.localtime())# 装饰 getXXXTime
getXXXTime = sayLocal(getXXXTime)print (getXXXTime())  

便捷写法:@sayLocal,如下

import timedef sayLocal(func):def wrapper():curTime = func()return f'当地时间: {curTime}'return wrapper@sayLocal
def getXXXTime():return time.strftime('%Y_%m_%d %H:%M:%S',time.localtime())print (getXXXTime())   

以 @sayLocal 开头后面接装饰器函数 的这种写法,是一种 语法糖 ,也就是便捷写法。当Python解释器执行 完 下面语句的时候,

@sayLocal

def getXXXTime():

就等于执行了这样的一条语句,比较方便

getXXXTime = sayLocal(getXXXTime)

被装饰的函数有参数

如果要装饰函数有 未知个数的参数, 怎么办呢?

像这样的2个函数,都要装饰

import time
def getXXXTimeFormat1(name):curTime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())return f'{curTime} ,数据采集者:{name} 'def getXXXTimeFormat2(name,place):curTime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())return f'{curTime} ,数据采集者:{name} , 采集地:{place}'

这时,可以使用函数的可变参数,像这样

import timedef sayLocal(func):def wrapper(*args,**kargs):curTime = func(*args,**kargs)return f'当地时间: {curTime}'return wrapper@sayLocal
def getXXXTimeFormat1(name):curTime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())return f'{curTime} ,数据采集者:{name} '@sayLocal
def getXXXTimeFormat2(name,place):curTime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())return f'{curTime} ,数据采集者:{name} , 采集地:{place}'print (getXXXTimeFormat1('张三'))
print (getXXXTimeFormat2('张三',place='北京'))    

其中 *args 可以接受一切 不指定参数名 的传参方式 , 比如 '张三'

**kargs 可以接受一切 指定参数名 的传参方式 , 比如 place='北京'

【python进阶】_装饰器相关推荐

  1. python进阶20装饰器

    原创博客地址:python进阶20装饰器 Nested functions Python允许创建嵌套函数,这意味着我们可以在函数内声明函数并且所有的作用域和声明周期规则也同样适用. 1 2 3 4 5 ...

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

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

  3. python 生成器装饰器_对Python生成器、装饰器、递归的使用详解

    1.Python生成器表达式 1).Python生成器表达式 语法格式: (expr for iter_var in iterable) (expr for iter_var in iterable ...

  4. python编写装饰器_写python中的装饰器

    python中的装饰器主要用于在已有函数实现功能前附加需要输出的信息,下面将用实例展示我如何写装饰器. 首先分别尝试写装饰器装饰一个无参函数和一个有参函数(被装饰函数仅输出,无返回值情况下) 1 de ...

  5. python中tracer函数意思_浅析Python编写函数装饰器

    本节主要介绍编写函数装饰器的相关内容. 跟踪调用 如下代码定义并应用一个函数装饰器,来统计对装饰的函数的调用次数,并且针对每一次调用打印跟踪信息. 这是一个通过类装饰的语法写成的装饰器,测试如下: 运 ...

  6. Python 进阶_生成器 生成器表达式

    目录 目录 相关知识点 生成器 生成器 fab 的执行过程 生成器和迭代器的区别 生成器的优势 加强的生成器特性 生成器表达式 生成器表达式样例 小结 相关知识点 Python 进阶_迭代器 & ...

  7. Python深入05 装饰器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法 ...

  8. python 进阶:修饰器的介绍

    参考链接:Python 函数装饰器 我认为python中的装饰器是一个很厉害的功能,他能瞬间提升代码的逼格,但对于我这样的小白来说,别说为所欲为的使用了,就连简单的尝试一下,却也是难于登天.经过长达半 ...

  9. python装饰器原理-python 中的装饰器及其原理

    装饰器模式 此前的文章中我们介绍过装饰器模式: 装饰器模式中具体的 Decorator 实现类通过将对组建的请求转发给被装饰的对象,并在转发前后执行一些额外的动作来修改原有的部分行为,实现增强 Com ...

  10. python装饰器类-PYTHON里的装饰器能装饰类吗

    扩展回答 如何理解python里的装饰器 通常可以理解它是一个hook 的回调函数. 或者是理解成python 留给二次开发的一个内置API. 一般是用回调和hook 方式实现的. 如何理解Pytho ...

最新文章

  1. C++之多重继承引发的重复调用
  2. css3 手机信号,CSS3 无线路由器连接信号动画
  3. linux中top性能分析工具中的TIME+
  4. s4800扫描电镜的CSS3_Hitachi S-4800型场发射扫描电子显微镜+能谱
  5. 11年写的一篇文章----智能终端安全现状及前景展望
  6. python里eval和input组合使用_python中eval()函数和input()函数用法解析
  7. Java排序算法——选择排序(Selection Sort)
  8. 腾讯地图获取经纬度 Java计算距离工具类
  9. 如何用excel做正交分析_最简单的正交试验教程,一次搞懂它!
  10. 计算机软件 属于特许权,​软件使用权是否属于无形资产
  11. ZigBee-CC2530单片机 - 实现软件自动复位
  12. 树莓派自带wifi工作不正常
  13. 飞龙在天之DB面试资料
  14. c语言打开文件报错 13,求帮忙看一段打开文件的代码~~真心无力了
  15. Stream Collectors - reducing
  16. LUAT游戏第一弹---贪吃蛇
  17. 硬盘读不出来如何恢复?好用的数据恢复软件分享
  18. 软件开发项目计划编制过程(转)
  19. SS2H框架搭建,基础上篇
  20. 我的世界服务器修改地图,我的世界如何修改地图?

热门文章

  1. 大话WiFi省电模式
  2. 计算机科学与技术单片机55,关于计算机技术与科学专业的考研信息
  3. idea php 断点设置,php - xdebug在IntelliJ Idea中跳过断点 - SO中文参考 - www.soinside.com...
  4. vim 插件_vim插件YouCompleteMe配置
  5. python中系列的含义_一篇文章让你彻底搞清楚Python中self的含义
  6. 音频在计算机中的存储
  7. 计算机组装各个配件的选用,组装电脑各个配件装机心得与经验
  8. Java:高级之泛型概念引入,泛型可以设置多个类型参数,泛型继承和泛型接口实现,限制泛型可用类型,泛型通配的方式,泛型方法,泛型方法限制泛型可用类型
  9. 自定义 VIEW 截图 保存到图库 并分享
  10. Linux下CMake简明教程(六)动态库和静态库的编译控制