迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

在 Python 中实现多个装饰器

作者:迹忆客 最近更新:2023/06/17 浏览次数:

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 装饰器重试代码块

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

使用 Python 装饰器重试代码块

发布时间:2023/06/17 浏览次数:94 分类:Python

在这种情况下,修改会在给定情况下多次重试函数,其返回值可能与我们想要的不同。@retry 装饰器的重要性 我们可以使用装饰器来扩展特定函数的行为,我们可以轻松地创建装饰器来修改该函

Python 装饰器顺序

发布时间:2023/06/17 浏览次数:192 分类:Python

在这篇 Python 文章中,我们将了解什么是装饰器、它们的使用方式以及我们如何利用它们来构建代码。 我们将看到装饰器是如何成为一种强大的工具,可以用来为我们的应用程序添加功能,并且

Python 中的 super参数

发布时间:2023/06/17 浏览次数:158 分类:Python

本文的主题是正确使用 Python 超级参数。 我们还将了解超和继承的概念、使用超参数的适当代码示例以及基类的概念。Python 中的 super 参数 在 Python 中,super 调用另一个类的方法。

将 Kwargs 传递给 Python 中的另一个函数

发布时间:2023/06/17 浏览次数:128 分类:Python

Python 将 kwargs 参数表示为关键字参数,可以在参数名称前使用两个星号传递参数数量。 通过这篇文章,我们寻找 Python 如何将 kwargs 传递给另一个函数。

在 Python 中打印度数符号

发布时间:2023/06/17 浏览次数:191 分类:Python

本篇文章将介绍如何用 Python 编写度数符号。度数符号是表示特定区域温度的符号。 例如,假设卡纳塔克邦的气温为 34 摄氏度; 它表明,在印度卡纳塔克邦,温度为 34 度

Python 中的 @ 符号

发布时间:2023/06/17 浏览次数:138 分类:Python

Python 中 @ 符号最常见的用例是装饰器。 装饰器允许您更改函数或类的行为。@ 符号也可以用作数学运算符,因为它可以在 Python 中乘以矩阵。 本教程将教您使用 Python 的 @ 符号。

Python 堆排序

发布时间:2023/06/17 浏览次数:184 分类:Python

本篇文章将介绍堆排序算法在 Python 中的实现。Python中的堆排序算法 堆排序是一种强大的算法,用于在 Python 中对数组和列表进行排序。 它很受欢迎,因为它非常快,并且不像合并排序和快速排

Python 拓扑排序

发布时间:2023/06/17 浏览次数:102 分类:Python

本篇文章将介绍拓扑排序算法在 Python 中的实现。Python 中的拓扑排序算法 拓扑排序算法对有向无环图 (DAG) 进行排序。

在 Python 中对日期和时间进行排序

发布时间:2023/06/17 浏览次数:82 分类:Python

在本文中,我们讨论了如何在 Python 中使用 sorted() 方法对日期和时间进行排序。 为了理解这个概念,我们举了一些例子以及 Python 中的 datetime 模块。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便