ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

装饰器 wrapper

2022-02-26 22:04:27  阅读:194  来源: 互联网

标签:函数 wrapper hello say debug 装饰


转载 CSDN博主作者luoz_python原创

装饰器 wrapper

1.装饰器的作用
装饰器的作用就是为已经存在的函数或对象添加额外的功能。
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。

2.无参数的装饰器

def debug(func):
def wrapper():
print('[DEBUG]: enter {}()'.format(func.__name__))
return func()
return wrapper

@debug
def say_hello():
print('hello!')
say_hello()
"""
[DEBUG]: enter say_hello()
hello!
"""

将 @debug 放在say_hello() 前面,相当于执行了
say_hello = debug(say_hello)
由于debug()是一个装饰器,返回了wrapper函数,所以原来的say_hello()依然存在,只是现在同名的now变量指向了新的函数,于是调用say_hello()将执行新的函数,即在debug()函数中返回的wrapper()函数。

将 @debug 放在say_hello() 前面,相当于执行了
say_hello = debug(say_hello)
由于debug()是一个装饰器,返回了wrapper函数,所以原来的say_hello()依然存在,只是现在同名的now变量指向了新的函数,于是调用say_hello()将执行新的函数,即在debug()函数中返回的wrapper()函数。

3.可变参数的装饰器

def debug(func):
def wrapper(*args, **kwargs):
print('[DEBUG]: enter {}()'.format(func.__name__))
return func(*args, **kwargs)
return wrapper

@debug
def say_hello(name, something):
print('hello!{}{}'.format(name, something))

say_hello('luozheng', '.')
"""
[DEBUG]: enter say_hello()
hello!luozheng.
"""

Python提供了可变参数*args和关键字参数**kwargs,有了这两个参数,装饰器就可以用于任意目标函数

 

————————————————
版权声明:本文为CSDN博主「luoz_python」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/luoz_java/article/details/90339876

标签:函数,wrapper,hello,say,debug,装饰
来源: https://www.cnblogs.com/chenianmingtong/p/15940599.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有