大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
前言
我们都知道装饰器的作用是在不改变原有的代码基础上,添加新的功能,但是这样会有一个弊端,被装饰的函数某些属性会变改变,接下来我们来看下
案例
import time
def run_time(func):
def wrapper(*args, **kwargs):
"""时间装饰器"""
time1 = time.time()
func(*args, **kwargs)
time2 = time.time()
cost_time = time2 - time1
return f"函数花了{cost_time}秒"
return wrapper
@run_time
def test():
"""测试"""
print([i for i in range(1, 100001) if i % 200 == 0])
if __name__ == '__main__':
print(test.__name__)
print(test.__doc__)
"""
结果
# wrapper
# 时间装饰器
"""
可以看到,我们明明打印的是test函数的__name__
属性,最后显示的却是run_time
的属性。
我们知道@run_time
装饰器实际上就等于test = run_time(test)
,此时我们打印test.__name__
实际上test已经指向了wrapper
,这样会造成我们打印的时候会打印装饰器的内嵌函数的名字和注释。
使用wraps装饰器解决
wraps
可以将原函数对象的指定属性复制给包装函数对象, 默认有 __module__
、__name__
、__doc__
、__qualname__
、__annotations__
或者通过参数选择
import time
from functools import wraps
def run_time(func):
@wraps(func)
def wrapper(*args, **kwargs):
"""时间装饰器"""
time1 = time.time()
func(*args, **kwargs)
time2 = time.time()
cost_time = time2 - time1
return f"函数花了{cost_time}秒"
return wrapper
@run_time
def test():
"""测试"""
print([i for i in range(1, 100001) if i % 200 == 0])
if __name__ == '__main__':
print(test.__name__)
print(test.__doc__)
"""
结果:
test
测试
"""
我们就只在原来的wrapper
内函数上加了一个@wraps(func)
装饰器,就可以打印出我们想要的结果了,这是因为wraps
可以将原函数对象的指定属性复制给包装函数对象,我们可以查看它的源码
def wraps(wrapped,
assigned = WRAPPER_ASSIGNMENTS,
updated = WRAPPER_UPDATES):
"""Decorator factory to apply update_wrapper() to a wrapper function
Returns a decorator that invokes update_wrapper() with the decorated
function as the wrapper argument and the arguments to wraps() as the
remaining arguments. Default arguments are as for update_wrapper().
This is a convenience function to simplify applying partial() to
update_wrapper().
"""
return partial(update_wrapper, wrapped=wrapped,
assigned=assigned, updated=updated)
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/164942.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...