Python装饰器如何实现修复过程解析
作者:Python探索牛 发布时间:2023-11-22 04:27:43
标签:Python,装饰器,修复
Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),
为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用。写一个decorator的时候,最好在实现之前加上functools的wrap,
它能保留原有函数的名称和docstring。
未加@wraps的时候:
from functools import wraps
def wrapper(func):
# @wraps(func)
def inner(*args, **kwargs):
print("装饰器工作中...")
func(*args, **kwargs)
return inner
@wrapper
def f1(arg):
"""
这是一个测试装饰器修复技术的函数
:param arg: 随便传
:return: 没有
"""
print(arg)
f1('呵呵')
print(f1.__name__,f1.__doc__)
打印结果是:
但是加上@wraps以后:
from functools import wraps
def wrapper(func):
@wraps(func)
def inner(*args, **kwargs):
print("装饰器工作中...")
func(*args, **kwargs)
return inner
@wrapper
def f1(arg):
"""
这是一个测试装饰器修复技术的函数
:param arg: 随便传
:return: 没有
"""
print(arg)
f1('呵呵')
print(f1.__name__,f1.__doc__)
打印结果是:
其中主要的就是两个变量:
1、显示 正在执行的函数的名称 f.name
2、显示 正在执行的函数的注释 f.doc
简单来说就是:
如果没使用@wraps,当A调用了装饰器B的话,即使A.name,返回的会是装饰器B的函数名称,而不是A的函数名称
如果使用了@wraps,当A调用了装饰器B的话,A.__ name__返回的会是A函数的名称,而不是饰器B的名称,
这也即使常说的@wraps是装饰器的修复技术,
实际就是修复还原了A的__ name__变量,同理__ doc__变量也是一样。
来源:https://www.cnblogs.com/djdjdj123/p/12181230.html


猜你喜欢
- 这几天看了篇叫"Penetration: from application down to OS (Oracle)"的文
- 前言排序是数据库中的一个基本功能,MySQL也不例外。用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order
- 一、前言现在到了,第二步,上一步我们已经做好了发牌模块,有了手牌,就需要判断牌型了,平时打扑克时,我们需要使用大脑进行判断自己手里的牌属于那
- 前言:Redhat下安装Python2.7rhel6.4自带的是2.6, 发现有的机器是python2.4。 到python网站下载源代码,
- 一、前情提要相信来看这篇深造爬虫文章的同学,大部分已经对爬虫有不错的了解了,也在之前已经写过不少爬虫了,但我猜爬取的数据量都较小,因此没有过
- 在网上找了很多资料,但是一直没有实际效果,现在终于搞定问题如下: 用的post请求,然后入参格式为json并且入参中包含中文,调用
- 最近帮人做了个贪吃蛇的游戏(交作业用),很简单,界面如下:开始界面:游戏中界面:是不是很简单、朴素。(欢迎大家访问GitHub)游戏是基于P
- 1、Python数据存储(压缩)(1)numpy.save , numpy.savez , scipy.io.savematnumpy和sc
- 载入库绘制表格我们需要用到python库中的matplotlib库import matplotlib.pyplot as plt一、折线图#
- 一:安装pip install web.py二:URL 处理任何网站最重要的部分就是它的URL结构。urls=('/',
- 本文实例分析了Python自定义进程池。分享给大家供大家参考,具体如下:代码说明一切:#encoding=utf-8#author: wal
- 本文实例讲述了Django框架首页和登录页分离操作。分享给大家供大家参考,具体如下:1.登录模板login.html<!DOCTYPE
- 数据驱动模式的测试好处相比普通模式的测试就显而易见了吧!使用数据驱动的模式,可以根据业务分解测试数据,只需定义变量,使用外部或者自定义的数据
- 1、创建表 createtableTest_Increase( useridnumber(10)NOTNULLprimarykey,/*主键
- 下面给大家介绍下mysql 8.0.16 初次登录修改密码mysql数据库初始化后初次登录需要修改密码初次登录会碰到下面这个错误ql>
- 1.sys模块sys模块的常见函数列表:sys.argv: 实现从程序外部向程序传递参数。sys.exit([arg]): 程序中间的退出,
- 一、需求golang默认的结构体json转码出来,都是根据字段名生成的大写驼峰格式,但是一般我们最常用的json格式是小写驼峰或者小写下划线
- 1) ERROR 1222 (21000): The used SELECT statements have a different num
- 通常,会话管理是通过服务器将 Session ID 作为一个 cookie 存储在用户的 Web 浏览器中来唯一标识每个用户会话。如果浏览器
- 忙活了三个多小时,连学带做,总算是搞出来了一个具有基本功能的串口通信PC机的GUI界面,Tkinter在python中确实很好用,而且代码量