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

Python中的装饰器是什么

发布时间:2023-12-15 19:55:52

装饰器是Python中的一种特殊语法结构,它允许我们在不修改原有函数的情况下,为函数添加额外的功能。装饰器可以用于日志记录、性能分析、输入验证等场景,同时也可以用于改变函数的行为,比如缓存函数结果等。

装饰器本质上是一个返回函数的高阶函数,它接受一个被装饰的函数作为参数,然后返回一个新的函数。新的函数通常在内部调用原函数,然后在其前后进行一些附加操作。我们可以直接使用@语法糖将装饰器应用到被装饰的函数上,这样就可以在函数定义时直接使用装饰器,而无需显式调用装饰器函数。

下面是一个简单的装饰器示例,用于记录函数的调用次数:

def count_calls(func):
    def wrapper(*args, **kwargs):
        wrapper.count += 1  # 在每次调用时增加计数
        print(f"函数 {func.__name__} 被调用了 {wrapper.count} 次")
        return func(*args, **kwargs)
    
    wrapper.count = 0  # 初始调用次数为0
    return wrapper

@count_calls
def say_hello():
    print("Hello, world!")

say_hello()
say_hello()

输出结果为:

函数 say_hello 被调用了 1 次
Hello, world!
函数 say_hello 被调用了 2 次
Hello, world!

在上面的例子中,我们定义了一个装饰器函数 count_calls,它接受一个函数参数 func。在装饰器内部,我们定义了一个新的函数 wrapper,它记录了函数被调用的次数,并在每次调用时打印调用次数。然后,我们使用 @count_calls 将装饰器应用到 say_hello 函数上。

通过装饰器,我们可以在不修改 say_hello 函数本身的情况下,实现了对函数调用次数的记录功能。

下面是另一个常见的装饰器示例,用于计算函数执行时间:

import time

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

@calculate_time
def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(30))

输出结果为:

函数 fibonacci 执行时间:0.3524510860443115 秒
832040

在上面的例子中,我们定义了一个装饰器函数 calculate_time,它接受一个函数参数 func。在装饰器内部,我们定义了一个新的函数 wrapper,它在调用被装饰的函数前后记录了时间,并计算执行时间差。然后,我们使用 @calculate_time 将装饰器应用到 fibonacci 函数上。

通过装饰器,我们可以在不修改 fibonacci 函数本身的情况下,实现了对函数执行时间的计算功能。

除了上面的例子,装饰器还可以用于很多其他场景,如输入验证、权限控制、缓存等。装饰器为我们提供了一种简洁、灵活的方式来扩展函数的功能,使得函数的代码更加整洁,复用性更强。