可变参装饰器
*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict。
并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前。
下列代码中用到的一些知识点,如:
import functools
@functools.wraps(a_func)等,在本文后续会有说明。
import functools
def a_new_decorator(a_func):
@functools.wraps(a_func)
def wrapTheFunction(*args, **kwargs):
print(a_func.__name__)
print("I am doing some boring work before executing a_func()")
a_func(*args, **kwargs)
print("I am doing some boring work after executing a_func()")
return wrapTheFunction
@a_new_decorator
def a_function_requiring_decoration3(a1, a2, a3):
print("a1 = {}\na2 = {}\na3 = {}".format(a1, a2, a3))
@a_new_decorator
def a_function_requiring_decoration2(a1, a2):
print("a1 = {}\na2 = {}".format(a1, a2))
@a_new_decorator
def a_function_requiring_decoration1(a1):
print("a1 = {}".format(a1))
a_function_requiring_decoration1('123')
a_function_requiring_decoration2('123', '456')
a_function_requiring_decoration3('123', '456', '789')
这部分代码主要是为了介绍装饰器可变参的情形。适配多种情况。
运行结果:
完善装饰器
上一篇博文里面讲到了装饰器,由于时间原因,我自己理解得并不透彻。
所以今天对于这部分内容进行了深入了解。
函数注释 """回车""" 在PyCharm中输入三个双引号"""然后回车,注释就出来了
类似这样:
"""
a_new_decorator
:param a_func:
:return: wrapTheFunction
"""
写注释的好处在于,我们调用 print(a_func.doc) 即可打印出函数注释,这样就能知道调用到那个函数,并且函数注释的内容都清楚了。也方便我们理解装饰器,因为引入了装饰器,通过打印__name__和__doc__,我们就能很清楚的知道调用了哪个函数。
在python里面,可以通过引入内置模块,快速的赋值函数的属性。
我这里用一些代码来演示:
def a_new_decorator(a_func):
def wrapTheFunction(*args, **kwargs):
"""
a_new_decorator
:param a_func:
:return: wrapTheFunction
"""
print(a_func.__name__)
print("I am doing some boring work before executing a_func()")
a_func(*args, **kwargs)
print("I am doing some boring work after executing a_func()")
return wrapTheFunction
@a_new_decorator
def a_function_requiring_decoration():
"""
a_function_requiring_decoration
:return: None
"""
print("I am the function which needs some decoration to "
"remove my foul smell")
print("__name__ = ", a_function_requiring_decoration.__name__)
print("__doc__ = ", a_function_requiring_decoration.__doc__)
以上代码中,我添加了注释,用于区分调用的函数。
查看运行结果:
这里打印的是装饰器里面定义的函数(wrapTheFunction)的信息。如果我们想要知道传入的函数的一些属性信息,需要引入内置模块 functools。
引入的两种方式:
from functools import wraps
import functools
对应的使用方式:
def a_new_decorator(a_func):
@functools.wraps(a_func)
@wraps(a_func)
def wrapTheFunction(*args, **kwargs):
"""
a_new_decorator
:param a_func:
:return: wrapTheFunction
"""
print(a_func.__name__)
print("I am doing some boring work before executing a_func()")
a_func(*args, **kwargs)
print("I am doing some boring work after executing a_func()")
return wrapTheFunction
@functools.wraps(a_func)和@wraps(a_func)是相同的,引入一个即可。
运行结果:
在a_new_decorator函数中打印的就是我们传入的方法的属性了。