本文实例讲述了Python装饰器基础概念与用法。,具体如下:
装饰器基础
前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自己编写新的装饰器的更多高级语法。
什么是装饰器
装饰是为函数和类指定管理代码的一种方式。Python装饰器以两种形式呈现:
【1】函数装饰器在函数定义的时候进行名称重绑定,提供一个逻辑层来管理函数和方法或随后对它们的调用。
【2】类装饰器在类定义的时候进行名称重绑定,提供一个逻辑层来管理类,或管理随后调用它们所创建的实例。
简而言之,装饰器提供了一种方法,在函数和类定义语句的末尾插入自动运行的代码——对于函数装饰器,在def的末尾;对于类装饰器,在class的末尾。这样的代码可以扮演不同的角色。
装饰器提供了一些和代码维护性和审美相关的有点。此外,作为结构化工具,装饰器自然地促进了代码封装,这减少了冗余性并使得未来变得更容易。
函数装饰器
通过在一个函数的def语句的末尾运行另一个函数,把最初的函数名重新绑定到结果。
用法
装饰器在紧挨着定义一个函数或方法的def语句之前的一行编写,并且它由@符号以及紧随其后的对于元函数的一个引用组成——这是管理另一个函数的一个函数(或其他可调用对象)。
在编码上,函数装饰器自动将如下语法:
@decorator
def F(arg):
...
F(99)
映射为这个对等形式:
def F(arg):
...
F = decorator(F)
F(99)
这里的装饰器是一个单参数的可调用对象,它返回与F具有相同数目的参数的一个可调用对象。
当随后调用F函数的时候,它自动调用装饰器所返回的对象。
换句话说,装饰实际把如下的第一行映射为第二行(尽管装饰器只在装饰的时候运行一次)
fun(6,7)
decorator(func)(6,7)
这一自动名称重绑定也解释了之前介绍的静态方法和property装饰器语法的原因:
class C:
@staticmethod
def meth(...):...
@property
def name(self):...
实现
装饰器自身是返回可调用对象的可调用对象。实际上,它可以是任意类型的可调用对象,并且返回任意类型的可调用对象:函数和类的任何组合都可以使用,尽管一些组合更适合于特定的背景。
有一种常用的编码模式——装饰器返回了一个包装器,包装器把最初的函数保持到一个封闭的作用域中:
def decorator(F):
def wrapper(*args):
# 使用 F 和 *args
# 调用原来的F(*args)
return wrapper
@decorator
def func(x,y):
...
func(6,7)