在 Python 中实现多个装饰器

文章目录

    • 实现一个装饰器:函数作为一等对象
    • 在 Python 中实现参数化装饰器
    • 在 Python 中使用 @ 实现装饰器
    • 在 Python 中实现多个装饰器
    • 总结


Python 最主要的特性之一是我们可以使用装饰器来改变函数或类的行为。 我们可以使用装饰器来更改程序中已有代码的部分程序。

装饰器是程序中的代码行,可在执行期间更改该程序的某些部分。 在编译期间引发对程序的更改的过程称为元编程。

在本文中,读者将了解装饰器的基础知识,即如何在 Python 中声明、实现和链接装饰器。


实现一个装饰器:函数作为一等对象

从语法上讲,我们可以通过将函数作为可迭代对象传递给另一个来声明装饰器。 这是可能的,因为 Python 中的一切都是一流的对象; 因此,我们可以将每个 Python 构造作为参数传递或将其分配给变量。

这意味着每个类、函数和声明的变量都可以作为对象传递。 下面的例子证明了这一点:

代码:

def func():
    def inner():
        print("Chocolate")
    return inner
taste = func()
taste()

输出:

"C:\Users\Win 10\main.py"
Chocolate

Process finished with exit code 0

这里创建了一个嵌套函数,其中父函数 func() 有一个内部函数 inner()inner() 函数打印一条语句并在函数内部返回自身。

装饰器函数 func() 将其数据传递给空对象函数 taste。 从而装饰它。

如果这个对象函数有任何功能,装饰器也会对其进行更改。 在本文的后面部分,您将看到装饰器如何用于引发对函数的更改。

在 Python 中,我们可以将函数作为参数传递和返回给其他函数。 装饰器也可以接受一个函数作为参数并使用这个概念返回结果。

下面的示例演示了参数化装饰器。 为了更容易理解它,可以将函数想象成真实世界的对象。


在 Python 中实现参数化装饰器

我们将展示一个面包店示例,以了解装饰器如何将其他函数作为参数化参数。

在这里,bakery 是一个参数化方法,它接受一个对象函数 obj_func() 作为参数。 在这个方法中,声明了一个嵌套函数 inner(),它打印 Dough。

之后,调用 obj_func() ,返回 inner() 函数。 调用对象函数调用被修饰的函数。

你可以仔细观察,bakery 是一个参数化方法,它接受参数 obj_func(),它只是函数 wheat(),并在 inner() 函数执行打印语句后调用它。

代码:

    def inner():
        print("Dough")
        obj_func()
    return inner

这个应该被修饰的函数,即小麦,有一个打印语句:Turned into bread

代码:

def wheat():
    print("Turned into bread")

创建一个新的对象函数 final 来存储装饰函数。

语法 object_function = decorator(decorated_function) 通过将函数 wheat() 作为对象传递给参数化方法 bakery 来装饰函数 wheat() ,它实现了 inner() 函数的属性。

代码:

final = bakery(wheat)
final()

装饰函数保存在对象函数final中。 编译时,程序先执行 inner() 函数,然后调用 obj_func() ,传入对象函数 wheat() 并打印其内容。

粗略地说,将小麦放入面包店时会转化为面包,结果打印为:Turned into bread。 就像面包店在现实世界中的运作方式一样!

代码:

def bakery(obj_func):
    def inner():
        print("Dough")
        obj_func()
    return inner


def wheat():
    print("Turned into bread")

final = bakery(wheat)
final()

输出:

"C:\Users\Win 10\main.py"
Dough
Turned into bread

Process finished with exit code 0

在 Python 中使用 @ 实现装饰器

本段演示了如何使用语法 @function_name 修饰函数。 在此示例中,使用了一个程序,该程序具有:

  1. 参数化嵌套函数;
  2. 一个内部函数,检查变量 x 和 y 之间的值,如果分子小于分母则交换它们;
  3. 用交换值修饰的第三个函数将两个数字相除并打印它们。

装饰器函数 decor_func 接受一个对象函数 obj1 作为它的参数。 在内部,如果分母字段中提供了更大的数字,则会创建内部函数来交换值。

代码:

def decor_func(obj1):
    def swap(x, y):

由于内部函数交换参数与函数 quot 参数相同,存储在 obj1 中的交换值从内部函数返回,在编译器执行之前将更改后的值传递给函数 quot。

在示例中,语法 @decor_func 在函数 quot 上方声明。 它告诉编译器获取函数 obj1 的参数并将它们传递给函数 quot。

代码:

def decor_func(obj1):
    def swap(x, y):
        if x < y:
            temp = x
            x = x + y - x
            y = y + temp - y
        return obj1(x, y)

    return swap

# Syntax to Decorate function
@decor_func
def quot(x, y):    # Displays quotient of variable x/y
    print(x / y)

quot(2,4)

输出:

"C:\Users\Win 10\main.py"
2.0

Process finished with exit code 0

在 Python 中实现多个装饰器

链接装饰器是一种将装饰器堆叠在一起的技术,这样目标函数就可以重复装饰@function_name 被声明的次数。

在下面的程序中,创建了两个函数,decor 和 decor1。 这些函数是装饰器并且有一个内部函数,它执行算术运算并返回结果。

要链接装饰器,它们必须在要装饰的函数上方一起定义(彼此重叠)。 还必须注意的是,编译器是从下往上读取装饰器的。

这意味着位于函数名称上方的装饰器首先实现,其他装饰器在其之后实现到顶部。

代码:

@decor # Gets implemented second
@decor1 # Gets implemented first
def num():
    return 5

在下面的示例中,函数 num() 将一个值串行返回给装饰器函数。 首先,decor1 获取值,将其传递给对象函数 func(),并将更改后的值返回给 num()。

类似地,用另一个装饰器函数重复这个过程。 最后,当打印 num() 时,它会产生 50 作为输出。

代码:

# code for testing decorator chaining
def decor1(func):
    def inner():
        x = func()
        return x * x
    return inner

def decor(func):
    def inner():
        x = func()
        return 2 * x
    return inner

@decor
@decor1
def num():
    return 5

print(num())

输出:

"C:\Users\Win 10\main.py"
50

Process finished with exit code 0

总结

本文为读者提供了一个关于如何在程序中使用装饰器的清晰画面。 读者应该了解如何将装饰器用于函数、如何将参数提供给装饰器以及如何链接多个装饰器。

你可能感兴趣的:(编程,Python,实用技巧,python,开发语言)