在 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
修饰函数。 在此示例中,使用了一个程序,该程序具有:
- 参数化嵌套函数;
- 一个内部函数,检查变量 x 和 y 之间的值,如果分子小于分母则交换它们;
- 用交换值修饰的第三个函数将两个数字相除并打印它们。
装饰器函数 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 装饰器重试代码块
发布时间: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 模块。