📅  最后修改于: 2023-12-03 15:34:32.426000             🧑  作者: Mango
装饰器(Decorator)是 Python 中用于改变函数或类原始功能的函数,它们通过添加一些代码来包装另一个函数或类。换句话说,装饰器是在不影响原函数或类代码的情况下,为函数或类添加额外的功能。
装饰器通常使用 @ 符号来表示,放在函数或类的上方。装饰器也是高阶函数,因为它们接受一个函数作为参数,并返回另一个函数。
装饰器提供了以下几方面的优势:
最简单的装饰器是匿名函数装饰器,它不需要定义一个新的函数。可以在现有函数的定义之前引用匿名函数。示例代码如下:
def my_decorator(func):
def wrapper():
print("Before function call")
func()
print("After function call")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
运行结果如下:
Before function call
Hello!
After function call
在这个例子中,我们定义了一个名为 my_decorator 的函数,它有一个 func 参数。该函数返回一个 wrapper() 函数,用于在原始函数的前面和后面添加打印语句。使用 @my_decorator
将 say_hello 函数装饰为 my_decorator 的输出。
装饰器也可以接受参数,可以在定义和调用装饰器时传入参数。下面是一个示例,展示如何使用带参数的装饰器:
def repeat(num):
def my_decorator(func):
def wrapper(*args, **kwargs):
for i in range(num):
print("Before function call")
func(*args, **kwargs)
print("After function call")
return wrapper
return my_decorator
@repeat(num=3)
def say_hello():
print("Hello!")
say_hello()
运行结果如下:
Before function call
Hello!
After function call
Before function call
Hello!
After function call
Before function call
Hello!
After function call
在这个例子中,我们定义了一个 my_decorator 函数,它有一个 func 参数。它返回一个名为 wrapper 的函数,在循环中调用原有的函数多次。
类装饰器就是以类的形式实现的装饰器。它使得我们可以将装饰器实现为一个可配置的类对象,拥有更多功能。
下面是一个示例:
class my_decorator(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("Before function call")
self.func(*args, **kwargs)
print("After function call")
@my_decorator
def say_hello():
print("Hello!")
say_hello()
运行结果如下:
Before function call
Hello!
After function call
在这个例子中,我们定义了一个名为 my_decorator 的类,其中有一个 __init__
方法和一个 __call__
方法。 __init__
方法接收一个函数 func
,并将其保存在类中。__call__
方法被调用来执行函数,类似于上面示例代码中的 wrapper 函数,但是它没有返回任何内容。
Python 装饰器是一项强大的功能,可以使代码更加模块化和清晰,提高代码的复用性和可维护性。装饰器是 Python 中一个非常重要的概念,在 Python 开发过程中会经常用到。