在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编程语言最好的特性之一。在本教程中,我们已经讲解了装饰器的高级概念。我们解释了简单的装饰器和有参数的装饰器。