欢迎访问宙启技术站
智能推送

在Python中使用装饰器来修改函数行为

发布时间:2023-12-02 23:35:37

在Python中,装饰器是一种特殊的函数,用于修改其他函数的行为。它们提供了一种简洁而优雅的方式来在不修改原函数代码的情况下,给函数增加额外的功能或改变其行为。

装饰器的定义是一个以被装饰函数为参数的函数,并返回一个新函数的闭包。这个新函数通常会在原函数的前后执行一些额外的操作,或者替换原函数的功能。

首先,我们来定义一个最简单的装饰器,用于在函数执行前后显示函数名:

def log_func_name(func):
    def wrapper(*args, **kwargs):
        print("Calling function:", func.__name__)
        result = func(*args, **kwargs)
        print("Finished calling function:", func.__name__)
        return result
    return wrapper

然后,我们可以使用装饰器来装饰我们想要修改行为的函数。例如:

@log_func_name
def add(x, y):
    return x + y

以上代码等同于:

def add(x, y):
    return x + y

add = log_func_name(add)

现在,每当调用add函数时,装饰器log_func_name会在函数执行前后打印函数名。例如:

result = add(2, 3)

输出结果为:

Calling function: add
Finished calling function: add

装饰器可以接受参数,来更灵活地修改函数行为。例如,我们可以定义一个带参数的装饰器log_with_level,用于指定打印日志的级别:

def log_with_level(level):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print(f"[{level}] Calling function:", func.__name__)
            result = func(*args, **kwargs)
            print(f"[{level}] Finished calling function:", func.__name__)
            return result
        return wrapper
    return decorator

然后,我们可以使用这个装饰器来装饰函数,并指定日志级别。例如:

@log_with_level("INFO")
def multiply(x, y):
    return x * y

现在,调用multiply函数时,会打印带有指定级别的日志。例如:

result = multiply(2, 3)

输出结果为:

[INFO] Calling function: multiply
[INFO] Finished calling function: multiply

以上是使用装饰器来修改函数行为的基本用法。装饰器提供了一种灵活而强大的方式来增加、修改或扩展函数的功能。我们可以使用装饰器来实现函数的缓存、日志记录、权限校验等功能,使代码更加优雅和可复用。