在Python中的嵌套装饰器

在Python中的嵌套装饰器

Python函数是Python编程语言中的一类对象。这意味着一个函数可以被赋值给一个变量,返回另一个函数,最重要的是,可以将另一个函数作为参数传递给函数。Python装饰器的概念基于这些函数的特点。

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

在Python中的嵌套装饰器

Python中的一切都是对象,每个对象在Python中都有与之关联的类。Python装饰器用于修改函数的行为,而不改变其实际值。装饰器就是它本身的建议 – 即装饰某个东西。

嵌套装饰器与普通装饰器一样简单。嵌套意味着放置或存储在其他对象内部。因此,嵌套装饰器意味着在函数内部应用多个装饰器。Python提供了实现一个函数的多个装饰器的功能。它使装饰器对于可重用的构建块非常有用,因为它将多个特性组合在一起。

如何使用嵌套装饰器

一个函数可以被多次装饰。嵌套装饰器也被称为装饰器链。要创建嵌套装饰器,首先我们需要定义要将输出字符串包装在其中的装饰器,然后使用加号语法(@符号)将它们应用到函数上。让我们理解以下语法。

语法 –

@function1
@function2
def function(name):
      print(f"{name}")

如上所述的语法中,有两个装饰器用于特定方法。这些装饰器将按照自底向上的方式执行,即逆序。我们可以参考建筑物的建造过程,从地面开始建造,然后再建造楼层。

让我们来看下面的示例。

示例

def lower(func):

    def wrapper():
        return func().lower()

    return wrapper

def upper(func):

    def wrapper():
        return func().upper() + ' OF NESTED DECORATORS.'

    return wrapper

@lower
@upper
def message():
    return 'This is a Basic program'

print(introduction())

输出:

this is a basic program of nested decorator.

解释 –

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

  • 通过使用’@’和函数名称,我们将两个装饰器应用于’message()’函数。在本程序中,我们使用了@upper和@lower。
  • 我们从底部开始执行。因此,首先将字符串用’FOR DECORATOR’包装,然后将所有字符串转换为小写。

示例2:

def decorator1(func):
    def wrap():
        print("      ")
        func()
        print("    $  $")
    return wrap

def decorator2(func):

    def wrap():
        print("# # # # # # # # # # # # # #")
        func()
        print("# # # # # # # # # # # # # #")
    return wrap

@decorator1
@decorator2
def message():
    print("Hello")

message()

输出:

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

嵌套参数装饰器

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

示例

def multiply(num):
    def mul(func):
        def _mul_method(a, b):
            return func(a, b) * num
        return _mul_method
    return mul

def divide(num):
    def div(func):
        def _div_method(a, b):
            return func(a, b) / num

        return _div_method
    return div


@divide(3)
@multiply(3)
def add(a, b):
    return a + b

print(add(1, 5))

输出:

6.0

解释 –

让我们来理解一下上面的代码做了什么 –

  • 我们定义了一个乘法装饰器,将结果乘以给定的数字。
  • 我们用除法装饰器做了相同的事情。
  • 当我们调用add(1, 5)方法时,它会进入乘法装饰器,并与3相乘,这里的值是add(1, 5) => 1 + 5 => 6*3 => 18。
  • 它进入除法装饰器;它执行18/3 => 6,我们得到答案。
  • 装饰器执行的顺序很重要。如果改变顺序,答案可能会不同。但在我们的情况下不会,因为我们是用相同的值进行除法和乘法运算。

额外程序

def multiply(num):
    def mul(func):
        def _mul_method(a, b):
            return func(a, b) * num
        return _mul_method
    return mul

def divide(num):
    def div(func):
        def _div_method(a, b):
            return func(a, b) / num

        return _div_method
    return div

def add_multiply_divide(a, b, c, d):
    @divide(d)
    @multiply(c)
    def add(m, n):
        return m + n
    return add(a, b)

print(add_multiply_divide(1, 5, 3, 2))

输出:

9.0

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

结论

装饰器是Python编程语言最好的特性之一。在本教程中,我们已经讲解了装饰器的高级概念。我们解释了简单的装饰器和有参数的装饰器。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程