如何使用Python编写装饰器函数?
装饰器是Python语言中进行元编程(meta programming)最常见,也是最基础的一种技巧。装饰器的作用是修改其他函数的功能,装饰器函数的定义方式是使用@符号+函数名,装饰器函数通常会返回内部函数。
下面我们将介绍如何使用Python编写装饰器函数。
1. 装饰器的定义方式
在Python中,我们可以使用"def"关键字来定义函数,同样,我们可以使用"def"关键字来定义装饰器函数,其基础语法如下:
def decorator_name(original_function):
def wrapper_function(*args, **kwargs):
# some wrapper code
return original_function(*args, **kwargs)
return wrapper_function
2. 装饰器的用法
使用装饰器的方式是将其直接应用到函数上面,可以使用“@”符号实现。例如:
@decorator_name
def foo():
pass
上面的代码表示将装饰器“decorator_name”应用到“foo”函数上。这种方式可以直接将装饰器的返回值赋值给foo函数。
3. 装饰器的分类
在Python中,装饰器按照功能和能力可以分为很多种,下面是一些基本的装饰器:
(1)计时器装饰器
计时器装饰器用于计算函数执行的时间,示例代码如下:
import time
def timer(func):
def wrapper():
start = time.time()
func()
end = time.time()
print('执行时间为:', end - start)
return wrapper
@timer
def test():
time.sleep(2)
test()
(2)日志装饰器
日志装饰器用于打印函数的执行日志,示例代码如下:
def logger(func):
def wrapper(*args, **kwargs):
print('开始执行函数: %s' % func.__name__)
result = func(*args, **kwargs)
print('函数 %s 执行结束' % func.__name__)
return result
return wrapper
@logger
def sum(*args):
a = 0
for i in args:
a += i
return a
print(sum(1, 2, 3, 4, 5))
4. 注意事项
(1)装饰器的返回值必须是内部函数,否则会报错。
(2)装饰器函数必须处理函数的参数,否则可能会导致参数错误。
(3)装饰器函数必须处理函数的返回值,否则可能会返回一个None值。
(4)装饰器的作用是增强原函数的功能,应该是非常通用的。
