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

我们知道,被装饰后的do_something函数其实不再是最初的do_something函数,而是装饰器内部定义的inner_func函数,所以,被装饰的函数的返回值只需要通过装饰器内部定义的inner_func函数返回返回即可即可。有点绕,不过对着上面的代码应该好理解。

3.2 被装饰函数带参数

对于装饰器,我们要深刻理解一件事:以上面的装饰器func和被装饰函数do_something为例,被装饰后的do_something函数已经不再是原来的do_something函数,而是装饰器内部的inner_func函数。这句话我已经在上文中我已经不止提过一次,因为真的很重要。如果被装饰的函数有参数(加入参数为name),我们还是通过do_something(name)的方式传递传输,不过,既然我们最终调用的时候,通过do_something实质调用的inner_func函数,那么在定义装饰器是,定义的inner_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)) return '我是返回值' if __name__ == '__main__': ret = do_something('姚明') print(ret)

输出结果:

do_something函数开始运行……

你好,姚明!

do_something函数结束运行……

我是返回值

一个装饰器可用于装饰千千万万个函数,则千千万万个函数参数情况可能各不相同,有的没有参数,有的可能多个参数,甚至还有关键字参数,对于这参数情况不同的函数,我们不可能为每个函数都写一个func装饰器,那怎么办呢?

Python中提供了*args, **kwargs这种机制来接受任意位置的位置参数和关键字参数,参数前面带*表示接受任意个数位置参数,接收到的所有位置参数存储在变量名为args的元组中,带**表示接受任意个数的关键字参数,接收到的所有关键字参数以字典的形式参数在变量名为kwargs的字典中。

当我们知道只有位置参数,但不知道有多少个位置参数是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: print('你好,{}!'.format(n)) if __name__ == '__main__': do_something('姚明') print('-------------------------------') do_something_2('姚大明', '姚小明') print('-------------------------------') do_something_3('姚一明', '姚二明', '姚三明', '姚四明')

输出结果:

do_something函数开始运行……

你好,姚明!

do_something函数结束运行……

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

do_something_2函数开始运行……

你好,姚大明!

你好,姚小明!

do_something_2函数结束运行……

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

do_something_3函数开始运行……

你好,姚一明!

你好,姚二明!

你好,姚三明!

你好,姚四明!

do_something_3函数结束运行……

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

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