Python装饰器函数的用法及常见示例
Python中的装饰器,可以认为是一种特殊的函数,它能够为其他函数添加额外的功能。本文将详细介绍Python装饰器的用法及常见示例,并为读者提供相关的代码示例和说明。
1. 装饰器函数的定义
Python中的装饰器函数就是一个函数,它的参数是一个函数,返回值也是一个函数。通常情况下,装饰器函数被定义成一个函数嵌套的形式,如下:
def decorator(func):
def wrapper(*args, **kwargs):
#在函数func前面执行的代码
ret = func(*args, **kwargs)
#在函数func后面执行的代码
return ret
return wrapper
上述代码中,装饰器函数decorator包含了一个内部函数wrapper,wrapper函数的参数和func函数的参数一样,并且调用func函数并返回func的返回值。在wrapper函数内部可以添加一些在func执行前、后需要执行的逻辑代码。
2. 装饰器函数的调用
我们可以用@符号来调用装饰器函数,例如:
@decorator
def my_func(a, b):
#函数体
pass
上述代码就是使用decorator函数来装饰my_func函数,相当于执行了以下代码:
my_func = decorator(my_func)
3. 装饰器函数的常见示例
3.1 计时装饰器
计时装饰器可以用来计算函数执行时间,代码如下:
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
ret = func(*args, **kwargs)
end = time.time()
print("函数 %s 执行时间:%f 秒" % (func.__name__, end-start))
return ret
return wrapper
这里使用Python的time模块来计算函数执行时间,@timer装饰器可以加在任何一个函数上,如下:
@timer
def my_func(a, b):
#函数体
pass
3.2 日志装饰器
日志装饰器可以用来记录函数的调用日志,代码如下:
def logger(func):
def wrapper(*args, **kwargs):
print("函数 %s 被调用" % func.__name__)
ret = func(*args, **kwargs)
print("函数 %s 调用结束,返回值为:%s" % (func.__name__, ret))
return ret
return wrapper
这里的logger装饰器可以用来记录函数调用的开始和结束,@logger装饰器可以加在任何一个函数上,如下:
@logger
def my_func(a, b):
#函数体
pass
3.3 缓存装饰器
缓存装饰器可以用来实现函数调用结果的缓存,避免重复计算,代码如下:
def cache(func):
data = {}
def wrapper(*args, **kwargs):
key = args + tuple(kwargs.items())
if key in data:
print("已经缓存了结果")
return data[key]
else:
ret = func(*args, **kwargs)
data[key] = ret
print("新计算结果")
return ret
return wrapper
这里的cache装饰器可以用来缓存函数的调用结果,@cache装饰器可以加在任何一个函数上,如下:
@cache
def my_func(a, b):
#函数体
pass
3.4 身份验证装饰器
身份验证装饰器可以用来验证用户的身份,代码如下:
def auth(func):
def wrapper(*args, **kwargs):
#先验证身份
if 有权限:
ret = func(*args, **kwargs)
return ret
else:
print("没有权限访问该函数")
return wrapper
这里的auth装饰器可以用来验证用户是否有访问某个函数的权限,@auth装饰器可以加在任何一个函数上,如下:
@auth
def my_func(a, b):
#函数体
pass
4. 注意事项
在Python中使用装饰器有一些注意事项,例如:
- 装饰器的函数名应该有意义,用于描述它所装饰的函数的功能。
- 装饰器中定义的内部函数应该继承被装饰的函数的签名,即包括参数和关键字参数。
- 装饰器中定义的内部函数应该返回被装饰函数的返回值。
- 装饰器中的逻辑代码应该放在内部函数wrapper中,而不是放在装饰器函数本身中。
5. 总结
本文详细介绍了Python装饰器的用法及常见示例,包括计时装饰器、日志装饰器、缓存装饰器、身份验证装饰器等。通过使用装饰器可以给函数添加额外的功能,提高代码的可读性和重用性,是Python编程中常用的技巧。
