python中 @的含义以及基本使用方法

  • Post category:Python

在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,可以为函数添加各种各样的功能。