上面例子定义func装饰器时,我们用*name来接受任意个数的位置参数,可别以为只能用*args,args只是一个变量名,只不过约定俗成,用的多一些,实际开发时你爱取啥名就用啥名,对于这个知识点不再多说,毕竟本篇主角是装饰器。我们继续装饰器内容!
当我们知道只有关键字参数,却不知道参数个数时,可以func装饰器这么写:
def func(f): def inner_func(**name): print('{}函数开始运行……'.format(f.__name__)) ret = f(**name) print('{}函数结束运行……'.format(f.__name__)) return ret return inner_func @func def do_something(name='无名氏'): print('你好,{}!'.format(name)) @func def do_something_2(name_1='无名氏', name_2='无名氏'): print('你好,{}!'.format(name_1)) print('你好,{}!'.format(name_2)) @func def do_something_3(**name): for n in name.keys(): print('你好,{}!'.format(name[n])) if __name__ == '__main__': do_something(name='姚明') print('-------------------------------') do_something_2(name_1='姚大明', name_2='姚小明') print('-------------------------------') do_something_3(name_1='姚一明', name_2='姚二明', name_3='姚三明', name_4='姚四明')
输出结果:
do_something函数开始运行……
你好,姚明!
do_something函数结束运行……
-------------------------------
do_something_2函数开始运行……
你好,姚大明!
你好,姚小明!
do_something_2函数结束运行……
-------------------------------
do_something_3函数开始运行……
你好,姚一明!
你好,姚二明!
你好,姚三明!
你好,姚四明!
do_something_3函数结束运行……
事实上,大多数情况下,我们对被装饰函数是一无所知的——我们不知道有多少个位置参数、多少个关键字参数,甚至对有没有位置参数、关键字参数都不知道,这时候,我们就只能*args和**kwargs齐上阵了: