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