版权声明:本文为博主原创文章,转载请附上出处。 https://blog.csdn.net/k_runtu/article/details/83021704
昨天下午仔细学习了装饰器的内容,算是比较明白了。标题的题目来源于这里
from functools import wraps
def log(ft):
if not isinstance(ft, str):
@wraps(ft)
def wrapper(*args, **kwargs):
print('wrapper')
return ft(*args, **kwargs)
return wrapper
else:
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
print('wrapper and text:{}'.format(ft))
return func(*args, **kwargs)
return wrapper
return decorator
# 测试结果:
In [2]: @log
...: def test():
...: print('test')
...:
In [3]: test()
wrapper
test
In [4]: @log('execute')
...: def test():
...: print('test')
...:
In [5]: test()
wrapper and text:execute
test
装饰器: 装饰器本身是一个函数,然后接受另外一个函数作为参数,在返回被装饰函数的执行结果的前后可以做些事情。比如:
from functools import wraps
def log(func):
@wraps(func)# wraps 的作用是处理装饰之后函数的__name__属性的改变
def wrapper(*args, **kwargs):
print('wrapper') # 在被装饰函数执行之前打印一些信息
return func(*args, **kwargs) # 原样返回原函数的返回值,参数不变
return wrapper
# 当装饰发生的时候,相当于 test = log(test)
# 如果装饰器本身需要接受参数的话, 相当于 test = log(args)(test), 所以在log这个装饰器内部需要返回一个类似不接受参数的装饰器,然后这个不需要接受参数的装饰器可以使用外部的参数,相当于闭包。
def log(text):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
print('wrapper and text:{}'.format(text)) # 可以使用text变量,相当于闭包
return func(*args, **kwargs)
return wrapper
return decorator # 返回一个相当于上面的不需要接受参数的装饰器(func参数是自动加上去的,为被装饰函数)