#-----------------------1--------------------------------------------#由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。

defnow():print('2019-3-25')

f=nowprint(f()) #2019-3-25

print(now.__name__) #now

print(f.__name__) #now

#----------------------2---------------------------------------------#增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,#这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。

deflog(func):def wrapper(*args, **kw):print('call %s():' % func.__name__)return func(*args, **kw)returnwrapper#上面的log,因为它是一个decorator,所以接受一个函数作为参数,并返回一个函数。#我们要借助Python的@语法,把decorator置于函数的定义处

@logdefnow():print('2019-3-26')

now()#call now(): 2019-3-26

#print(now.__name__) # wrapper

#把@log放到now()函数的定义处,相当于 now = log(now)#由于log()是一个decorator,返回一个函数,所以,原来的now()函数仍然存在,只是现在同名的now变量指向了新的函数,于是调用now()将执行新函数,即在log()函数中返回的wrapper()函数。#wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。在wrapper()函数内,首先打印日志,再紧接着调用原始函数。

#----------------3----------------------------------------------------#自定义log的文本:

deflog(text):defdecorator(func):def wrapper(*args, **kw):print('%s %s():' % (text, func.__name__))return func(*args, **kw)returnwrapperreturndecorator#如下@ 相当于now = log('execute')(now)

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

now()#execute now(): 2015-3-27#上面的语句,首先执行log('execute'),返回的是decorator函数,#再调用返回的函数,参数是now函数,返回值最终是wrapper函数。

#----------------------4----------------------------------------------

print(now.__name__) #wrapper#因为返回的那个wrapper()函数名字就是'wrapper',所以,需要把原始函数的__name__等属性复制到wrapper()函数中,#否则,有些依赖函数签名的代码执行就会出错。#不需要编写wrapper.__name__ = func.__name__这样的代码,Python内置的functools.wraps就是干这个事的#修改log

importfunctoolsdeflog(func):

@functools.wraps(func)def wrapper(*args, **kw):print('call %s():' % func.__name__)return func(*args, **kw)returnwrapper#或#def log(text):#def decorator(func):#@functools.wraps(func)#def wrapper(*args, **kw):#print('%s %s():' % (text, func.__name__))#return func(*args, **kw)#return wrapper#return decorator

@logdefnow():print('2019-3-28')print(now.__name__) #now

python decorator_python3(十八)decorator相关推荐

  1. python三十八:re模块

    正则表达式(re模块)是一种小型的,高度专业化的编程语言.(在python中)它内嵌在python中,并通过re模块实现.正则表达式模块被编译成一系列字节码,然后由用c编写的匹配引擎执行. 正则就是处 ...

  2. python二十八:模块

    模块: 在python中,一个.pywe文件称为一个模块. 使用模块,可以提高代码的可维护性. 分类: 1.python标准库    2.第三方模块    3.应用程序自定义模块 import做了两件 ...

  3. [Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  4. Python基础(十八): 类和对象以及它们的属性

    一.类 最简单的经典类结构 class 类名:pass 复制代码 1.定义一个类 class Money:pass 复制代码 类名规范: 驼峰命名法, 并且首字母大写 2.实例化一个对象 创建一个对象 ...

  5. Python进阶(十八)Python3爬虫小试牛刀

    文章目录 一.前言 二.网址分析 三.获取标题 四.获取访问量 五.尾页判断 六.编程实现 七.注意事项 一.前言 这篇文章主要介绍了如何使用Python3爬取csdn博客访问量的相关资料,在Pyth ...

  6. Hello Python(十八)——PyInstaller打包发布

    一.PyInstaller简介 1.PyInstaller简介 PyInstaller是一个跨平台的Python应用打包工具,支持 Windows/Linux/MacOS三大主流平台,能够把 Pyth ...

  7. python四十八:多态

    多态: 对象如何通过他们共同的属性和动作来操作及访问,而不需要考虑他们具体的类. 比如: # 字符串和列表都有__len__方法 ss = "ssssss" lt = [1,2,3 ...

  8. python第二十八课——编码小常识

    2.内存和硬盘: 内存:计算机硬件组成部分之一,它是一个容器,用来存储数据:处理数据速度快, 存储数据量小:断电死机数据会丢失,短暂性存储数据 硬盘:计算机硬件组成部分之一,它是一个容器,用来存储数据 ...

  9. 《OpenCv视觉之眼》Python图像处理十九:Opencv图像处理实战四之通过OpenCV进行人脸口罩模型训练并进行口罩检测

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  10. Python ---(十九)Tkinter窗口组件:Toplevel

    上一篇:Python -(十八)Tkinter窗口组件:PanedWindow The Tkinter Toplevel Widget ##简介 Toplevel(顶级窗口)组件类似于 Frame 组 ...

最新文章

  1. 今晚直播 | 谷歌资深工程师手把手教你使用TensorFlow最新API构建学习模型
  2. https refused 解决方法
  3. 嵌入式arm linux 文件系统登入密码的修改笔记
  4. BugKuCTF WEB web4
  5. 隐藏功能_IOS 14.2 隐藏功能
  6. Google BBR拥塞控制算法模型初探
  7. jfinal分页时使用like
  8. 2019年 iPad无法充电
  9. Git教程(快速上手,超详细)
  10. 破解版 中易广告联盟程序 v6.0
  11. 为何不能直接拷贝软件安装好的目录运行
  12. cocos2d-x打飞机实例总结
  13. K8s(资源管理,namespace,Pod)
  14. Linux命令之大文件分割
  15. uvm event 事件机制
  16. java毕业设计—— 基于java+JSP+SSH的任务调度系统设计与实现(毕业论文+程序源码)——任务调度系统
  17. 红米4A Android 版本,#MIUI#关于红米手机4高配版 Android版本适配的说明【miui9吧】_百度贴吧...
  18. 什么是拼多多上货助手?拼多多上货助手有哪些功能?详细介绍
  19. 那些年的自动驾驶仿真软件
  20. 深入浅出解答hero刷rom的各种问题

热门文章

  1. 如何使用MOQ进行单元测试
  2. CentOS下双网卡绑定-bond0
  3. 服务器各项指标的图形化显示
  4. [转载]HTML5 Audio/Video 标签,属性,方法,事件汇总
  5. IIS安装程序无法复制文件的问题 安装IIS提示安装程序无法复制文件staxmem.d...
  6. .NET 中的对象序列化
  7. 扇贝有道180902每日一句
  8. Atitit 知识图谱管理 谱存储选型 与查询 目录 1. 知识图谱存储系统的选型。 1 1.1. 图数据库 neo4j 适合大规模数据 1 1.2. 关系数据库 小规模 2 2. 知识图谱查询语言
  9. Atitit 云计算体系树.docx Atitit 云计算之道 attilax著 艾龙 著 serverless bomb 1. 什么才是云计算的根本特征.. 2 2. 云计算体系 2 3. “云
  10. Atitit 提升团队开发效率项目进度的一些大的流程方向attilax总结