函数装饰器(decorator)的基本原理和常用应用
发布时间:2023-07-01 09:39:39
函数装饰器是Python中一种特殊的语法,用于对已有的函数进行修改和增强而不修改其原始代码。其基本原理是使用一个装饰器函数,接收一个函数作为输入,并返回一个经过修改后的函数。
在Python中,函数是一等公民,因此函数可以被当作参数传递给其他函数。装饰器就是利用了这一特性,将待装饰的函数作为参数传递给一个装饰器函数,并对其进行一系列的处理操作,然后返回一个新的函数供调用。
常用的装饰器应用包括:
1. 计时器装饰器:用于统计函数的运行时间。可以在装饰器内部使用time模块来计算函数的运行时间,然后在函数运行前后进行记录。
import time
def timer(func):
def wrapper():
start_time = time.time()
result = func()
end_time = time.time()
print("函数运行时间:", end_time - start_time)
return result
return wrapper
@timer
def some_function():
# 函数体代码
pass
some_function()
2. 日志记录装饰器:用于记录函数的执行过程和结果。可以在装饰器内部创建一个日志文件,在函数的开始和结束时分别写入时间信息和函数的输入参数及返回值。
def logger(func):
def wrapper(*args, **kwargs):
with open("log.txt", "a") as f:
f.write("函数开始执行:{}
".format(time.ctime()))
result = func(*args, **kwargs)
f.write("函数执行结束:{}
".format(time.ctime()))
f.write("输入参数:{}
".format((args, kwargs)))
f.write("返回值:{}
".format(result))
return result
return wrapper
@logger
def some_function(arg1, arg2):
# 函数体代码
pass
some_function("参数1", "参数2")
3. 权限验证装饰器:用于限制函数的执行权限。可以在装饰器内部判断用户是否有权限调用该函数,如果没有权限则抛出异常或直接返回空值。
def check_permission(func):
def wrapper(*args, **kwargs):
if user_has_permission():
return func(*args, **kwargs)
else:
raise Exception("无权限调用该函数!")
return wrapper
@check_permission
def some_function():
# 函数体代码
pass
some_function()
通过使用装饰器,可以在不修改原始函数代码的情况下对函数进行增强和修改,提高代码的重用性和可维护性。同时,装饰器还可以简化代码结构,提高代码的可读性和简洁性。
