在Python中,@符号的主要用途是作为装饰器(Decorator)的标识符。Decorator以比较简单的方式修改或增强原有函数的功能,例如添加缓存、日志、验证等机制。
基本使用方法
如果要使用Decorator的话,需要定义一个函数并使用@符号将其应用到目标函数上。下面是一个简单的示例:
def add_logger(func):
def wrapper(*args, **kwargs):
print("执行前:打印日志")
result = func(*args, **kwargs)
print("执行后:打印日志")
return result
return wrapper
@add_logger
def add_nums(a, b):
return a + b
print(add_nums(1, 2))
在这个例子中,add_logger
是一个Decorator函数,它将被应用到add_nums
函数上。使用@符号,可以将add_nums函数与add_logger函数关联起来,表明add_logger
是适用于add_nums
的装饰器。
上面的代码实现的是一个简单的日志记录机制,每次执行add_nums
函数时,会先打印“执行前:打印日志”,在函数执行完毕之后,会再次打印“执行后:打印日志”。
示例1:性能测试
除了用于记录日志之外,Decorator还可以用于测试函数执行时间:
import time
def time_it(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print("执行时间:", end - start)
return result
return wrapper
@time_it
def calculate_sum(N):
sum = 0
for i in range(N):
sum += i
return sum
print(calculate_sum(10000))
在这个例子中,time_it
是一个Decorator函数,它将被应用到calculate_sum
函数上。使用@符号,可以将calculate_sum函数与time_it函数关联起来。
示例2:授权验证
Decorator不仅可以用于测试函数的执行时间,还可以在函数调用之前做授权验证:
def ensure_permission(func):
def wrapper(*args, **kwargs):
if kwargs.get("permission") == "admin":
result = func(*args, **kwargs)
return result
else:
raise Exception("权限不足")
return wrapper
@ensure_permission
def delete_file(file_path, permission):
print(f"已删除文件{file_path}")
delete_file(file_path="test.txt", permission="admin")
在这个例子中,ensure_permission
是一个Decorator函数,它将被应用到delete_file
函数上。使用@符号,可以将delete_file函数与ensure_permission函数关联起来。如果调用delete_file时传递的permission参数不是”admin”,则会抛出一个异常。
这就是@符号在Python中的基本使用方法、含义与应用。通过自定义Decorator,可以为函数添加各种各样的功能。