摘要:的装饰器是用来装饰函数的。简单装饰器装饰器的语法糖是使用符号表示,装饰器本身也是一个函数,只不过参数是函数而已。保留函数的元信息被修饰之后的函数,它的元信息都消失,被替换的函数代替。中提供了来保存函数的元信息。
python的装饰器是用来装饰函数的。这是什么意思呢?假如我们有一个函数,这个函数的功能不能满足我们现有的需求,那么我们可以通过装饰器在这个函数执行前执行后做一些我们需要的操作(如果函数本身功能不满足,那就直接修改方法体了,不需要装饰器帮忙)。
1. 简单装饰器装饰器的语法糖是使用@符号表示,装饰器本身也是一个函数,只不过参数是函数而已。
def decor_function(func): def wrapper_function(): print("[%s] %s() called" % (ctime(), func.__name__)) return func() return wrapper_function @decor_function def my_func(): print("Hello world") ... my_func()
decor_function也就是我们的装饰器函数,它对原有的函数进行包装,返回一个包装过的函数wrapper_function。使用@修饰过的函数my_func,返回的函数实际上是装饰器返回的函数wrapper_function.
[Mon Jul 9 17:07:40 2018] my_func() called Hello world2. 修饰含有参数的函数
函数定义可以使用任意的参数,那么装饰器函数如何处理呢?其实很简单,使用*args和**kargs就可以方便的调用了,只需要在装饰器函数的返回的函数中将参数传递给被修饰的函数就可以了。
def decor_function(func): def wrapper_function(*args, **kargs): print("[%s] %s() called" % (ctime(), func.__name__)) return func(*args, **kargs) return wrapper_function @decor_function def my_func_with_param(name): print("Hello", name) my_func_with_param("Joe")
[Mon Jul 9 17:12:58 2018] my_func_with_param() called Hello Joe3. 装饰函数带参数
装饰器函数本身也是可以带参数的,使用参数,可以根据具体的场景添加不同的功能实现。
def decor_function_with_parm(level): if level == "info": logging.info("info message logged") elif level == "error": logging.error("error message logged") else: logging.debug("debug message logged") def wrapper_outter_func(func): def wrapper_inner_func(*args, **kargs): func(*args, **kargs) return wrapper_inner_func return wrapper_outter_func @decor_function_with_parm(level="info") def my_func2(name): print("Hello,", name) my_func2("Joe")
带参数的装饰器函数写起来比较麻烦,因为需要处理的参数比较多,一般最外层的函数处理装饰器参数,接下来的函数处理func,最后一层函数用来处理被修饰的函数的参数。
4. 多重修饰一个函数可以被多个装饰器修饰,like this
@decor_function_with_parm(level="info") @decor_function def my_func(): print("Hello world")
执行的顺序是:
f = decor_function_with_parm(level="info", decor_function(my_func()))5.使用类来处理
类的__call__()方法可以把类当成函数来处理,所以类也可以用做装饰器
class Decor: def __init__(self, func): print("__init__ method called") self.func = func def __call__(self, *args, **kargs): print("__call__ method called") self.func(*args, **kargs) @Decor def func(name): print("func called") print("Hello,",name) func("joe")
使用类做装饰器时,init函数中添加被修饰函数的引用,在call函数中处理参数。
__init__ method called __call__ method called func called Hello, joe6.保留函数的元信息
被修饰之后的函数,它的元信息都消失,被替换的wrapper函数代替。python中提供了functools.wraps来保存函数的元信息。wraps本身也是个装饰器
def decor_function(func): @wraps(func) def wrapper_function(*args, **kargs): print("[%s] %s() called" % (ctime(), func.__name__)) print(func.__name__) return func(*args, **kargs) return wrapper_function @decor_function def my_func_with_param(name): print("Hello", name) my_func_with_param("joe") print(my_func_with_param.__name__)
[Mon Jul 9 18:16:11 2018] my_func_with_param() called my_func_with_param Hello joe my_func_with_param
参考:理解 Python 装饰器看这一篇就够了
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/41968.html
摘要:变量查找规则在中一个变量的查找顺序是局部环境,闭包,全局,内建闭包引用了自由变量的函数。闭包的作用闭包的最大特点是可以将父函数的变量与内部函数绑定,并返回绑定变量后的函数,此时即便生成闭包的环境父函数已经释放,闭包仍然存在。 导语:本文章记录了本人在学习Python基础之函数篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、掌握装饰器的本质、功...
摘要:初步认识装饰器函数装饰器用于在源代码中标记函数,以某种方式增强函数的行为。函数装饰器在导入模块时立即执行,而被装饰的函数只在明确调用时运行。只有涉及嵌套函数时才有闭包问题。如果想保留函数原本的属性,可以使用标准库中的装饰器。 《流畅的Python》笔记本篇将从最简单的装饰器开始,逐渐深入到闭包的概念,然后实现参数化装饰器,最后介绍标准库中常用的装饰器。 1. 初步认识装饰器 函数装饰...
摘要:一般情况下,我们使用装饰器提供的语法糖,来简化上面的写法像上面的情况,可以动态修改函数或类功能的函数就是装饰器。本文标题为会打扮的装饰器本文链接为参考资料修饰器的函数式编程中的装饰器介绍思诚之道装饰器入门与提高赖明星 装饰器 我们知道,在 Python 中,我们可以像使用变量一样使用函数: 函数可以被赋值给其他变量 函数可以被删除 可以在函数里面再定义函数 函数可以作为参数传递给另外...
摘要:我们以测量函数运行时间为例来讲一讲装饰器的运行原理。三更加通用的装饰器前面两部分讲了装饰器的原理,这一部分就讲讲要写出一个通用的装饰器需要注意的问题。首先就是参数的问题,装饰器返回的函数不是原来的函数,函数的签名也就和原来的函数签名不一样。 一、最简单的装饰器 装饰器是python中很基础也很实用的一个特性。通过装饰器我们可以很方便地为一些函数添加相同的功能。我们以测量函数运行时间为例...
阅读 2027·2019-08-30 15:52
阅读 2390·2019-08-29 18:37
阅读 770·2019-08-29 12:33
阅读 2812·2019-08-29 11:04
阅读 1497·2019-08-27 10:57
阅读 2066·2019-08-26 13:38
阅读 2739·2019-08-26 12:25
阅读 2409·2019-08-26 12:23