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

使用装饰器增强函数的功能性

发布时间:2023-05-22 02:32:05

装饰器是 Python 中函数式编程的一种应用方式,它可以将一个函数作为参数传递给另一个函数,然后返回一个新函数。通过使用装饰器,可以轻松地增加函数的功能性,比如添加日志、计时等。

增加日志功能

日志记录是程序开发中必不可少的一环。当出现问题时,日志将起到重要的作用,帮助我们分析错误的原因。我们可以使用 Python 自带的 logging 模块来记录日志,使用装饰器来增加日志功能的代码如下:

import logging

def log(func):
    def wrapper(*args, **kw):
        logging.basicConfig(filename='example.log', level=logging.INFO)
        logging.info('Executing function: %s' % func.__name__)
        return func(*args, **kw)
    return wrapper

@log
def greeting(name):
    print('Hello,%s!'%name)

greeting('Tom')

在上面的代码中,我们定义了一个名为 log 的装饰器。在这个装饰器中,我们定义了一个新的函数 wrapper,它将原函数 func 作为参数。在 wrapper 函数中,我们设置了一个文件名为 example.log 的日志文件,并设置了日志级别为 INFO。然后,我们记录了函数的执行,使用 logging.info() 函数记录的信息。最后,返回原函数 func 的执行结果。

在这个例子中,我们使用了装饰器 @log 来增加日志功能。当我们调用函数 greeting 时,会记录对应日志信息到 example.log 中。

增加计时功能

函数的计时功能是另一个常见的需求。我们可以使用 Python 自带的 time 模块来计算函数的执行时间,使用装饰器来增加计时功能的代码如下:

import time

def timing(func):
    def wrapper(*args, **kw):
        start_time = time.time()
        res = func(*args, **kw)
        end_time = time.time()
        print('execute time: %.4f s' % (end_time - start_time))
        return res
    return wrapper

@timing
def fib(n):
    if n == 1 or n == 2:
        return 1
    return fib(n-1) + fib(n-2)

print(fib(20))

在上面的代码中,我们定义了一个名为 timing 的装饰器。在这个装饰器中,我们定义了一个新的函数 wrapper,它将原函数 func 作为参数。在 wrapper 函数中,我们记录了函数的执行时间,并使用 print() 函数打印了执行时间。最后,返回了原函数 func 的执行结果。

在这个例子中,我们使用了装饰器 @timing 来增加计时功能。当我们调用函数 fib 时,会记录执行时间,并打印输出。

总结

在 Python 中,装饰器是一个十分便捷的方式来增加函数的功能性。通过装饰器,我们能够在不改变原函数代码的情况下,增加各种功能,如日志记录、计时等。装饰器不仅提供了便利,还可以让代码看起来更加优雅和简洁。