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

使用装饰器(Decorator)改变函数的行为

发布时间:2023-12-03 20:06:32

装饰器是Python语言中的一种语法,它可以修改已有函数的行为,而无需修改函数本身的定义。装饰器的作用类似于给函数加上一个外壳,可以在执行函数之前或之后加入额外的功能逻辑。

使用装饰器可以实现很多功能,比如添加日志、计时、权限验证等。下面我们将以一个示例来说明如何使用装饰器改变函数的行为。

假设我们有一个简单的函数,用于计算一个数的平方:

def square(num):
    return num ** 2

现在我们想给这个函数添加一个日志功能,即在函数被调用时打印相关信息。我们可以定义一个装饰器来实现这个功能:

def log_decorator(func):
    # 定义内部函数,用于在调用被装饰的函数之前打印日志
    def wrapper(*args, **kwargs):
        print("日志:函数 {} 被调用。".format(func.__name__))
        return func(*args, **kwargs)
    return wrapper

上述代码定义了一个名为log_decorator的装饰器,它接受一个函数作为参数,并返回一个新的函数wrapperwrapper函数用于在调用被装饰的函数之前打印日志,并最终执行被装饰的函数。

现在,我们可以使用@语法糖将装饰器应用到我们的函数上:

@log_decorator
def square(num):
    return num ** 2

这样,每当调用square函数时,都会先打印一条日志信息,然后再执行函数本身。例如,执行square(5)会输出以下日志信息:

日志:函数 square 被调用。

除了添加日志功能,装饰器还可以实现其他功能,比如计时、权限验证等。下面是一个实现计时功能的装饰器示例:

import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print("函数 {} 执行时间:{} 秒。".format(func.__name__, end_time - start_time))
        return result
    return wrapper

这个装饰器接受一个函数作为参数,并在调用被装饰的函数之前记录开始时间,之后记录结束时间并打印函数的执行时间。

使用这个装饰器可以很方便地给函数添加计时功能,例如:

@timer_decorator
def square(num):
    time.sleep(1)  # 模拟函数执行时间
    return num ** 2

执行square(5)会输出如下信息:

函数 square 执行时间:1.0036704540252686 秒。

通过上述示例,我们可以看到,使用装饰器可以很方便地改变函数的行为,而无需修改函数本身的定义。这种方式可以使代码更加模块化和可维护,同时也提高了代码的重用性。