欢迎访问宙启技术站
智能推送

初探Python核心装饰器

发布时间:2023-12-27 02:49:07

在Python中,装饰器是一种特殊的函数,它用于修改其他函数的功能。装饰器本身就是一个函数,它接受一个函数作为参数,并返回另一个函数。在函数调用前后,装饰器可以添加一些附加的功能。

装饰器是Python中非常有用的特性,它能够简化代码,提高代码的可读性和复用性。装饰器可以用于日志记录、权限校验、性能测试等方面。

下面是一个简单的例子来说明装饰器的使用。

def logger(func):
    def wrapper(*args, **kwargs):
        print('Calling function:', func.__name__)
        return func(*args, **kwargs)
    
    return wrapper

@logger
def add(a, b):
    return a + b

result = add(2, 3)
print('Result:', result)

在上面的例子中,我们定义了一个装饰器函数logger,它接受一个函数作为参数,并返回另一个函数wrapperwrapper函数在调用被装饰的函数之前会打印一条日志,然后调用被装饰的函数并返回结果。

在定义函数add之前,我们使用@logger语法将logger装饰器应用到add函数上。这样,当我们调用add函数时,实际上调用的是装饰器返回的wrapper函数。所以,在调用add函数之前会先打印一条日志。

运行上面的代码,输出如下:

Calling function: add
Result: 5

可以看到,在调用add函数之前会打印一条日志,然后才会计算并返回结果。

除了在函数调用前添加额外的功能外,装饰器还可以在函数调用后添加额外的功能。

def stopwatch(func):
    def wrapper(*args, **kwargs):
        import time
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        run_time = end_time - start_time
        print('Run time:', run_time)
        return result
    
    return wrapper

@stopwatch
def multiply(a, b):
    return a * b

result = multiply(2, 3)
print('Result:', result)

在上面的例子中,我们定义了一个装饰器函数stopwatch,它在调用被装饰的函数之前记录开始时间,在调用之后记录结束时间,并计算程序运行的时间。然后打印出程序运行时间。

同样地,在定义函数multiply之前,我们使用@stopwatch语法将stopwatch装饰器应用到multiply函数上。这样,当我们调用multiply函数时,实际上调用的是装饰器返回的wrapper函数。所以,在调用multiply函数之前会记录开始时间,在调用之后会记录结束时间并打印运行时间。

运行上面的代码,输出如下:

Run time: 1.9073486328125e-06
Result: 6

可以看到,在调用multiply函数之后会打印程序运行时间。

装饰器是Python中非常强大和灵活的特性,可以用于各种场景。通过装饰器,我们可以轻松地修改其他函数的行为,提供额外的功能。装饰器能够简化代码,提高代码的可读性和复用性。初学者可以通过使用现成的装饰器来提高代码的质量,有一定经验的开发者也可以自己编写装饰器来满足特定的需求。