热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python装饰器的简要说明

装饰器一共有三种内置装饰器,类装饰器、函数装饰器、


在开发Python程序的时候经常会看到 函数定义的第一行上面有一行类似  @aaaa 这样的文本,这是Python的装饰器,Python的装饰器英文名为Decorator,是一种特殊形式的函数。通过装饰器,我们可以给函数重用很多共通的功能函数,装饰器的语法糖符号是 @ 。


装饰器一共有三种内置装饰器,类装饰器、函数装饰器、带参数的函数装饰器,今天我们主要简单说明下装饰器的用途和基本使用方法。


一:简要装饰器

通过一个简单的例子,我们看一看装饰器的用法。


@my_decorator
def my_func(stuff):
do_things()

上面这个例子中,@my_decrator这个装饰器被加在了函数my_func上。这段代码相当于是把my_func当作参数传入my_decorator中,如下:


def my_func(stuff):
    do_things()
my_func = my_decorator(my_func)

二:实际例子

下面我们通过一个实际的例子来了解其用途,我们想对一个函数插入一段执行时间日志。


1.首先定义装饰器 log

import time
def log(func):
    def wrapper(*args,**kw):
        print("call %s()" % func.__name__)
        print("excute time is:" + time.strftime("%Y-%m-%d %H:%M:%S"),time.localtime())
        return func(*args,**kw)
return wrapper


2.使用装饰器

@log
def excute(name):
print('excute '+name)


excute('start')


3.执行结果

call excute()
excute time is:2019-06-23 23:09:12 time.struct_time(tm_year=2019, tm_mon=6, tm_mday=23, tm_hour=23, tm_min=9, tm_sec=12, tm_wday=6, tm_yday=174, tm_isdst=0)
excute start

我们从上面的例子中可以看出excute函数的逻辑代码并没有被改变,而是在函数之外实现了日志的功能,这样我们的代码的耦合性就会降低。


总结

以上只是对装饰器用法的简单介绍,装饰器需要自己多做一些实验来做验证,在Flask的框架中使用装饰器的时间特别多,大家可以看看Flask对装饰器的处理。

我平时在使用装饰器主要会在以下情景中使用到,大家可以参考一下:

1.注入参数,提供默认的参数或者生成新的格式的参数

2.记录函数的行为(日志、缓存、定时等)

3.预处理(登陆验证等上下文环境的环境处理)





推荐阅读
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • Java编程实现邻接矩阵表示稠密图的方法及实现类介绍
    本文介绍了Java编程如何实现邻接矩阵表示稠密图的方法,通过一个名为AMWGraph.java的类来构造邻接矩阵表示的图,并提供了插入结点、插入边、获取邻接结点等功能。通过使用二维数组来表示结点之间的关系,并通过元素的值来表示权值的大小,实现了稠密图的表示和操作。对于对稠密图的表示和操作感兴趣的读者可以参考本文。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
author-avatar
cxsw01
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有