📜  python creare decoratori - Python (1)

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

Python 创建装饰器

在 Python 中,装饰器可以用来修改函数的行为或添加额外的功能。下面我们将介绍如何创建装饰器。

基本语法

在 Python 中,装饰器是一个函数,它接受一个函数作为参数,并返回一个新的函数,通常包装了原始函数。例如,假设我们有一个函数 func

def func():
    print("Hello, world!")

我们可以创建一个装饰器,它添加了额外的功能,比如输出函数被调用的时间:

import time

def timer(func):
    def wrapper():
        start_time = time.time()
        func()
        end_time = time.time()
        print("Time elapsed:", end_time - start_time)
    return wrapper

@timer
def func():
    print("Hello, world!")

func()

在上面的代码中,我们定义了一个名为 timer 的装饰器函数,它接受一个函数作为参数。然后,定义一个名为 wrapper 的新函数,它调用原始函数,并记录执行时间。最后,我们返回包装了原始函数的新函数,并使用装饰器语法(@timer)将其应用到函数 func 上。

当我们运行上面的代码时,输出将类似于以下内容:

Hello, world!
Time elapsed: 1.9073486328125e-06

在输出中,我们可以看到原始函数 func 被调用,并且装饰器添加了额外的功能(记录了执行时间)。

使用带参数的装饰器

我们可以扩展装饰器,使其接受参数,以实现更细粒度的控制。下面我们通过一个示例来演示如何创建带参数的装饰器。

def repeat(num):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for i in range(num):
                func(*args, **kwargs)
        return wrapper
    return decorator

@repeat(num=3)
def func(msg):
    print(msg)

func("Hello, world!")

在上面的代码中,我们定义了一个名为 repeat 的装饰器函数,它接受一个整数参数 num。然后,定义一个名为 decorator 的新函数,它接受一个函数作为参数。然后,定义一个名为 wrapper 的新函数,它调用原始函数多次,次数为 num。最后,我们返回包装了原始函数的新函数,并使用装饰器语法(@repeat(num=3))将其应用到函数 func 上。

当我们运行上面的代码时,输出将类似于以下内容:

Hello, world!
Hello, world!
Hello, world!

在输出中,我们可以看到原始函数 func 被调用了多次,以及装饰器添加了额外的功能(重复执行原始函数)。

总结

在 Python 中,装饰器是一种强大的工具,可以用来修改函数的行为或添加额外的功能。在本文中,我们了解了如何创建装饰器以及如何使用带参数的装饰器。如果你想进一步了解 Python 中的装饰器,请参考 Python 官方文档。