python3 开发面试题(装饰器必须考)6.4

时间:2023-12-04 16:57:20
def f():
print("2018-06-04") # 每次调用f的时候 在打印"2018-06-04" 之前打印一句 开始, 之后再打印一句 结束
def wrapper(func):
def inner():
print("start")
func()
print("end")
return inner @wrapper
def f():
print("2018-06-04")

答案

但这里面还是有缺陷的,原函数如果有功能注释的话,经过装饰器装饰的函数,就看不到原函数的注释,所以我们可以优化一下

from functools import wraps    #优化装饰器的模块

def wrapper(func):
@wraps(func) #在这里装饰
def inner(*args, **kwargs): #有参数的情况
print("start")
ret = func(*args, **kwargs)
print("end")
return ret #有返回值的情况下
return inner @wrapper
def f(*args, **kwargs): #有参数的情况下
"""
这是一个测试装饰器的函数,没什么其他的用法
:param args:
:param kwargs:
:return:
"""
print("2018-06-04") f() # inner()
print(f.__doc__)
print(f.__name__) '''
start
2018-06-04
end 这是一个测试装饰器的函数,没什么其他的用法
:param args:
:param kwargs:
:return: f
'''