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 中,我们可以将函数作为参数传递和返回给其他函数。 装饰器也可以接受一个函数作为参数并使用这个概念返回结果。
下面的示例演示了参数化装饰器。 为了更容易理解它,可以将函数想象成真实世界的对象。
我们将展示一个面包店示例,以了解装饰器如何将其他函数作为参数化参数。
在这里,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
本段演示了如何使用语法 @function_name
修饰函数。 在此示例中,使用了一个程序,该程序具有:
装饰器函数 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
链接装饰器是一种将装饰器堆叠在一起的技术,这样目标函数就可以重复装饰@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
本文为读者提供了一个关于如何在程序中使用装饰器的清晰画面。 读者应该了解如何将装饰器用于函数、如何将参数提供给装饰器以及如何链接多个装饰器。