了解Python中的装饰器函数和用法
Python是一门高级编程语言,其中装饰器函数(Decorator)是Python中重要的特性之一。装饰器函数由@标记符和函数名组成,最初是在Python 2.4版本中引入的。
装饰器的作用是修改或增强已有的函数的功能,而装饰器函数本身是一个函数接受其他函数作为参数,返回一个新的函数给调用者。装饰器通常用来实现AOP编程(Aspect-Oriented Programming,面向切面编程),例如添加日志、计时器、缓存等操作,以提高程序的可维护性和扩展性。
下面简单介绍Python中装饰器的用法和实现方法。
一、装饰器的语法
装饰器的语法如下所示:
@decorator
def function():
pass
其中,@符号紧跟着装饰器的名称,把装饰器函数放在函数def关键字的上方。
二、最简单的装饰器
下面是最简单的装饰器示例,打印出函数调用时间:
import time
def timeit(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print('cost time: {}s'.format(end - start))
return result
return wrapper
@timeit
def foo(x):
time.sleep(x)
foo(1)
输出结果为:
cost time: 1.00033211708s
在foo函数上面加上@timeit装饰器,表示运行foo函数时调用timeit函数进行装饰。timeit函数接收一个函数作为参数,返回一个新函数作为装饰后的函数。
在新函数中,首先记录函数开始时间,调用原始函数,记录函数结束时间,并打印出函数调用花费的时间。
三、带参数的装饰器
装饰器可以带参数,例如:
def repeat(num):
def decorator(func):
def wrapper(*args, **kwargs):
for i in range(num):
print('Repeat {}th, result: {}'.format(i+1, func(*args, **kwargs)))
return wrapper
return decorator
@repeat(num=3)
def foo():
return 42
输出结果为:
Repeat 1th, result: 42 Repeat 2th, result: 42 Repeat 3th, result: 42
在装饰器函数中定义一个新的函数,接收原始函数作为参数,再定义一个wrapper函数作为装饰后的函数。在新函数中覆盖原来的函数,加上自己想要的功能,例如在foo函数中,扩展了一个repeat(num)函数用来重复调用foo函数。
四、嵌套的装饰器
装饰器也可以嵌套使用,例如:
def bold(func):
def wrapper():
return "<b>{}</b>".format(func())
return wrapper
def italic(func):
def wrapper():
return "<i>{}</i>".format(func())
return wrapper
@italic
@bold
def hello():
return "hello, world!"
hello()
输出结果为:
<i><b>hello, world!</b></i>
在上面代码中,先使用bold装饰器去装饰函hello,再使用italic装饰器去装饰装饰过后的函数。最终输出结果是:
<i><b>hello, world!</b></i>
此外,还有一些Python内置的装饰器,例如classmethod,staticmethod等,可以让类方法的调用变得更加灵活和高效。
总结:
Python中的装饰器函数是一种非常实用的工具,它可以让我们方便地实现AOP编程,有效地提高代码的可维护性和扩展性。在实际开发中,我们可以结合Python内置装饰器和自定义装饰器来实现各种功能。
