装饰器是Python语言中的一种特殊语法,它可以在不改变原函数代码的情况下,给函数添加额外的功能,比如日志记录、性能统计、权限控制等。
装饰器的基本语法如下:
@decorator
def func():
pass
其中,decorator
是一个函数,它接收一个函数作为参数,并返回一个新的函数。在上述语法中,@decorator
表示将decorator
函数应用到func
函数上,等价于执行了以下语句:
func = decorator(func)
下面通过几个示例来讲解装饰器的具体使用。
- 记录函数执行时间
import time
def timeit(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f'{func.__name__} executed in {end - start:.2f}s')
return result
return wrapper
@timeit
def myfunc():
time.sleep(1)
myfunc() # 输出:myfunc executed in 1.00s
在上述示例中,我们定义了一个timeit
装饰器,它会记录被装饰函数的执行时间,并在函数执行完毕后打印出来。使用装饰器的方式是在函数定义前加上@timeit
,这样myfunc
函数就会被timeit
装饰器修饰。
- 权限控制
def check_permission(func):
def wrapper(*args, **kwargs):
if not user.has_permission('admin'):
raise Exception('Permission denied')
return func(*args, **kwargs)
return wrapper
@check_permission
def myfunc():
pass
myfunc() # 如果user没有'admin'权限,会抛出异常
在上述示例中,我们定义了一个check_permission
装饰器,它会检查当前用户是否有admin
权限,如果没有,则抛出异常。使用装饰器的方式是在函数定义前加上@check_permission
,这样myfunc
函数就会被check_permission
装饰器修饰。
- 记录函数调用次数
def count_calls(func):
def wrapper(*args, **kwargs):
wrapper.count += 1
return func(*args, **kwargs)
wrapper.count = 0
return wrapper
@count_calls
def myfunc():
pass
myfunc()
myfunc()
print(myfunc.count) # 输出:2
在上述示例中,我们定义了一个count_calls
装饰器,它会记录被装饰函数被调用的次数。使用装饰器的方式是在函数定义前加上@count_calls
,这样myfunc
函数就会被count_calls
装饰器修饰。在count_calls
装饰器中,我们定义了一个wrapper.count
属性,用于记录函数调用次数。
总结:
装饰器是Python语言中非常强大的特性,它可以帮助我们在不改变原函数代码的情况下,给函数添加额外的功能。通过使用装饰器,我们可以很方便地实现日志记录、性能统计、权限控制等功能。