Python 中的类装饰器

2024 年 8 月 29 日 | 4 分钟阅读

装饰器是 Python 中重要且有用的工具。它允许我们修改函数或类的行为。到目前为止,我们已经学习了如何使用函数制作装饰器,但在这里我们将讨论将类定义为装饰器。在本教程中,我们将学习制作类装饰器。您熟悉装饰器;如果不熟悉,请从我们的 Python 装饰器教程中详细了解装饰器。

装饰器允许我们包装另一个函数,以扩展被包装函数的行为而不永久更改它。

让我们看下面的例子。

示例 -

输出

**********
50
**********

解释 -

在上面的代码中,我们创建了 star() 装饰器,它接受一个整数作为参数并返回一个可调用对象。可调用对象以函数 func 作为参数,该函数将被装饰。此外,可调用对象可以从装饰器工厂访问 n

现在我们将使用 Python 类来实现这个装饰器。

Python 类装饰器

要定义类装饰器,我们需要使用类的 __call__() 方法。当我们想要创建一个像函数一样工作的对象时,函数装饰器必须返回一个像函数一样工作的对象。让我们理解下面的例子。

示例 - 1

输出

WelCome to JavaTpoint

解释 -

我们已经使用 __call 方法创建了一个简单的类装饰器。我们可以根据需要对其进行修改。现在,我们将使用类装饰器重写上面的代码。

示例 - 2

输出

*****
50
*****

解释 -

pattern(5) 返回 Pattern 的一个实例,该实例是可调用的,因此它的工作方式如下。

add = Pattern(5)(add)

带有 return 语句的类装饰器

我们可以在类装饰器中使用 return 语句。在前面的例子中,我们没有返回任何东西,所以没有问题。但有时我们需要返回值。我们可以按如下方式进行。

示例 -

输出

Given number is: 25
Cube of number is: 15625

解释 -

在上面的代码中,我们创建了 CubeDecorataor 类作为装饰器,并调用了 __call__() 方法。在 __call__() 中,我们调用了 caller 函数并返回了结果。

使用类装饰器打印程序执行时间

我们将 time 模块与 __call__ 方法一起使用来获取程序的执行时间。让我们理解下面的例子。

示例 -

输出

Execution took 4.004076242446899 seconds

解释 -

在上面的代码中,我们从 time 模块导入了 time 方法并将其命名为 t。然后我们创建了 ExecutionTimer 类作为装饰器,在其中我们在程序开始执行时获取开始时间,在程序结束时获取结束时间。我们将开始时间减去结束时间,从而获得程序执行时间。

结论

在本教程中,我们通过一些示例介绍了类装饰器。装饰器是 Python 中的重要工具,可以在不更改其实际实现的情况下更改另一个函数的行为。大多数时候,我们使用 Python 函数来定义装饰器,但类装饰器也很有用,并且可以提高代码的可读性。类装饰器可以扩展为接受参数,或者在未传递参数时回退到默认值。