📜  Python装饰器(1)

📅  最后修改于: 2023-12-03 15:34:32.426000             🧑  作者: Mango

Python装饰器

什么是装饰器?

装饰器(Decorator)是 Python 中用于改变函数或类原始功能的函数,它们通过添加一些代码来包装另一个函数或类。换句话说,装饰器是在不影响原函数或类代码的情况下,为函数或类添加额外的功能。

装饰器通常使用 @ 符号来表示,放在函数或类的上方。装饰器也是高阶函数,因为它们接受一个函数作为参数,并返回另一个函数。

装饰器的优势

装饰器提供了以下几方面的优势:

  • 代码复用性,避免代码重复编写。
  • 解耦功能实现,让逻辑更加清晰。
  • AOP(面向切面编程)的支持,比如日志,性能测试等功能可以通过装饰器实现。
装饰器的应用
匿名函数装饰器

最简单的装饰器是匿名函数装饰器,它不需要定义一个新的函数。可以在现有函数的定义之前引用匿名函数。示例代码如下:

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 开发过程中会经常用到。