python 装饰器

装饰器(Decorator)是 Python 中的一种高级特性,它用于在不修改函数或类的源代码的情况下,动态地增加或修改它们的功能。装饰器本质上是一个返回函数的函数,它可以在函数调用之前或之后执行额外的代码。

装饰器的语法使用 @ 符号,放在函数定义的前一行。让我们详细讲解装饰器,并通过一些示例来理解它的工作原理。

基本装饰器

装饰器是一个接受函数作为参数并返回一个新函数的高阶函数。以下是一个简单的装饰器示例:

输出:

在这个示例中:

  1. simple_decorator 是一个装饰器函数,它接受一个函数 func 作为参数,并返回一个新的 wrapper 函数。
  2. wrapper 函数在调用 func 之前和之后添加了额外的代码。
  3. @simple_decorator 语法将 say_hello 函数包裹在 simple_decorator 中,使得 say_hello 被调用时实际上执行的是 wrapper 函数。

带参数的装饰器

如果被装饰的函数接受参数,装饰器也需要处理这些参数。以下是一个带参数的装饰器示例:

输出:

在这个示例中,wrapper 函数使用 *args**kwargs 来接受任意数量的位置参数和关键字参数,并将它们传递给原始函数 func

带参数的装饰器工厂

有时候,我们希望装饰器本身能够接受参数。为此,我们可以编写一个返回装饰器的函数,这种函数称为装饰器工厂。以下是一个示例:

输出:

在这个示例中:

  1. repeat 是一个装饰器工厂,它接受参数 num_times 并返回一个 decorator_repeat 装饰器。
  2. decorator_repeat 装饰器将 num_times 传递给 wrapper 函数,以控制原始函数 func 被调用的次数。

装饰类方法

装饰器也可以用于类方法。以下是一个示例:

输出:

在这个示例中,装饰器 method_decorator 用于类方法 say_hello,并在调用方法之前打印一条消息。

内置装饰器

Python 提供了一些常用的内置装饰器,例如 @staticmethod@classmethod@property

  1. @staticmethod:将方法转换为静态方法,不需要实例参数 self
  2. @classmethod:将方法转换为类方法,接受类参数 cls
  3. @property:将方法转换为属性,使得可以像访问属性一样访问方法。

以下是一个示例:

通过这些示例,我们可以看到装饰器在 Python 中的强大功能,它使得代码更加简洁、可读,并且易于维护。