Python装饰器介绍

在 Python 中,装饰器(Decorator)是一种特殊的语法功能,它可以用来修改、扩展或包装函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为输入,并返回一个新的函数或类。装饰器在函数和类的定义之前使用 @ 符号来应用。

装饰器的主要作用有:

  1. 添加额外功能:装饰器可以在不修改原始函数或类的情况下,为其添加额外的功能。例如,可以用装饰器来添加日志记录、性能监测、缓存等功能。

  2. 分离关注点:装饰器可以将不同关注点的代码分离开来,使得代码更加模块化和易于维护。原始函数或类只关注核心功能,而其他功能通过装饰器进行添加。

  3. 代码复用:装饰器可以用于多个函数或类,从而实现代码的复用。当多个函数或类需要相同的功能时,可以使用相同的装饰器来添加这些功能,避免重复编写代码。

  4. AOP(面向切面编程):装饰器是 AOP 的一种实现方式,它可以在不改变原有代码的情况下,将与核心功能无关的横切逻辑(例如日志记录、权限验证等)独立出来,从而提高代码的可维护性和可重用性。

  5. 实现缓存:装饰器可以用于实现缓存功能,将函数的计算结果缓存起来,避免重复计算,提高程序的执行效率。

  6. 修改行为:装饰器可以修改函数或类的行为,使其符合特定需求。例如,可以用装饰器来进行输入验证、异常处理等。

日志记录装饰器:

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Calling function {func.__name__} with arguments {args} and keyword arguments {kwargs}")
        result = func(*args, **kwargs)
        print(f"Function {func.__name__} returned {result}")
        return result
    return wrapper

@log_decorator
def add(a, b):
    return a + b

add_result = add(2, 3)

输出结果:

Calling function add with arguments (2, 3) and keyword arguments {}
Function add returned 5

缓存装饰器:

未使用缓存装饰器的时间消耗:

import time

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

start_time = time.time()
result = fibonacci(35)
end_time = time.time()

print(f"Fibonacci(35) = {result}")
print(f"Time taken without cache decorator: {end_time - start_time:.5f} seconds")

输出

Fibonacci(35) = 9227465
Time taken without cache decorator: 8.12685 seconds

使用了缓存装饰器:

import time

def cache_decorator(func):
    cache = {}

    def wrapper(*args):
        if args in cache:
            return cache[args]
        else:
            result = func(*args)
            cache[args] = result
            return result

    return wrapper

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

start_time = time.time()
result = fibonacci(35)
end_time = time.time()

print(f"Fibonacci(35) = {result}")
print(f"Time taken with cache decorator: {end_time - start_time:.5f} seconds")

输出

Fibonacci(35) = 9227465
Time taken with cache decorator: 0.01433 seconds
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值