Python装饰器深入全面理解(5)

def func(f): def inner_func(*name1, **name2): print('{}函数开始运行……'.format(f.__name__)) ret = f(*name1, **name2) 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(*name1, **name2): for n in name1: print('你好,{}!'.format(n)) for n in name2.keys(): print('你好,{}!'.format(name2[n])) if __name__ == '__main__': do_something(name='姚明') print('-------------------------------') do_something_2(name_1='姚大明', name_2='姚小明') print('-------------------------------') do_something_3('姚一明', '姚二明', '姚三明', name_4='姚四明')

输出结果:

do_something函数开始运行……

你好,姚明!

do_something函数结束运行……

-------------------------------

do_something_2函数开始运行……

你好,姚大明!

你好,姚小明!

do_something_2函数结束运行……

-------------------------------

do_something_3函数开始运行……

你好,姚一明!

你好,姚二明!

你好,姚三明!

你好,姚四明!

do_something_3函数结束运行……

3.3 装饰器本身带参数

我们上面写的装饰器都没有参数,或者说只有一个自带参数,也就是被装饰函数f。其实,装饰器也是可以有其他参数的,这样的装饰器更加灵活。我们通过实例来说明:现在我们要对上面的func装饰器进行改进,需要做到灵活控制装饰器是用中文输出还是用英文输出,代码如下。

def language(lang='中文'): # 这里带参数 def func(f): # 往里嵌套了一层 def inner_func(*name1, **name2): if lang=='中文': print('{}函数开始运行……'.format(f.__name__)) else: print('The function of {} starts runging…'.format(f.__name__)) ret = f(*name1, **name2) if lang=='中文': print('{}函数结束运行……'.format(f.__name__)) else: print('The function of {} ends runging…'.format(f.__name__)) return ret return inner_func return func @language('中文') def do_something(name): print('你好,{}!'.format(name)) @language('English') def do_something_2(name): print('你好,{}!'.format(name)) if __name__ == '__main__': do_something(name='姚明') print('-------------------------') do_something_2(name='姚明')

输出如下:

do_something函数开始运行……

你好,姚明!

do_something函数结束运行……

-------------------------

The function of do_something_2 starts runging…

你好,姚明!

The function of do_something_2 ends runging…

可以看到,通过装饰器带参数的方式,我们只需要在定义被装饰函数时,指定装饰器参数,就可以灵活控制每个被装饰函数提示的语言。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b06b6a34177ef29eb92256fd117164fe.html