Python 中的嵌套装饰器

17 Mar 2025 | 4 分钟阅读

在 Python 编程语言中,函数是一等公民。这意味着一个函数可以被赋值给一个变量,可以返回另一个函数,最重要的是,可以接受另一个函数作为参数。Python 装饰器的概念正是基于函数的这些特性。

假设你对 Python 装饰器有基本的了解。如果你不熟悉装饰器,可以从我们的 Python 装饰器教程 中学习。在本教程中,我们将学习嵌套装饰器或装饰器链。

Python 中的嵌套装饰器

Python 中的一切都是对象,并且每个对象都有其关联的类。Python 装饰器用于修改函数的行为而不改变其实际值。装饰器顾名思义——它用来装饰东西。

嵌套装饰器和普通装饰器一样简单。嵌套意味着将其放置或存储在另一个里面。因此,嵌套装饰器意味着在一个函数中应用多个装饰器。Python 提供了为函数实现多个装饰器的便利。这使得装饰器有用,因为它们由几个特性组合而成,可作为可重用的构建块。

嵌套装饰器如何使用?

一个函数可以被装饰多次。嵌套装饰器也称为装饰器链。要创建嵌套装饰器,首先我们需要定义要包装输出字符串的装饰器,并使用 @ 符号将其应用于函数。让我们理解下面的语法。

语法 -

正如我们在上面的语法中看到的,有两种装饰器适用于特定的方法。这些装饰器将以自下而上的方式执行,即反向顺序。我们可以参考建筑物的建造过程,从地面开始,然后向上建造楼层。

让我们理解下面的例子。

示例 -

输出

this is a basic program of nested decorator.

解释 -

在上面的代码中,我们首先定义了两个装饰器函数,它们用于将装饰器函数的输出字符串包装在字符串的 `lower()` 和 `upper()` 函数中。

  • 我们使用 '@' 和函数名对 `message()` 函数应用了两个装饰器。在这个程序中,我们使用 @upper 和 @lower。
  • 我们是从下往上执行的。因此,字符串首先被 'FOR DECORATOR' 包装,然后将所有字符串转换为小写。

示例 - 2

输出

$ $ $ $ $ $ $ $ $ $ $ $ $ $
# # # # # # # # # # # # # #
Hello
# # # # # # # # # # # # # #
$ $ $ $ $ $ $ $ $ $ $ $ $ $

嵌套参数化装饰器

现在,让我们实现嵌套参数化装饰器,其中方法接受参数。在这里,我们将创建两个参数化装饰器——一个执行两个参数的乘法,另一个执行除法。让我们看下面的例子。

示例 -

输出

6.0

解释 -

让我们理解我们在上面的代码中所做的事情——

  • 我们定义了 multiply 装饰器,它将结果值乘以给定的数字。
  • 我们对 divide 装饰器也做了同样的处理。
  • 当我们调用 add(1, 5) 方法时,它会进入 multiply 装饰器并乘以 3,这里的值是 add(1, 5) => 1 + 5 => 6*3 => 18。
  • 它进入 divide 装饰器;它执行 18/3 => 6。然后我们得到答案。
  • 装饰器的执行顺序很重要。如果我们改变顺序,答案可能会不同。但在这个例子中不是,因为我们用相同的值进行除法和乘法。

奖励程序

输出

9.0

上面的代码与之前的示例工作方式相同;装饰器也可以应用于方法内部。

结论

装饰器是 Python 编程语言最棒的特性之一。在本教程中,我们涵盖了装饰器的进阶概念。我们解释了简单和参数化装饰器。