1.装饰器介绍

  装饰器(Decorator)是 Python 中一种用于修改函数或类的行为的高级技术。装饰器本质上是一个函数,它接受一个函数作为输入,并返回一个新的函数作为输出。通过使用装饰器,可以在不修改原始函数代码的情况下,添加额外的功能或修改函数的行为

装饰器的用法如下:

  1. 定义装饰器函数:创建一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数。
  2. 使用装饰器修饰函数:在要修饰的函数前面加上 @装饰器函数名 的语法糖。
  3. 调用修饰后的函数:通过调用修饰后的函数来执行原始函数,并获得装饰器添加的额外功能或修改的行为。

1.1用函数的形式创建装饰器

下面是一个示例,展示了装饰器的用法:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"调用函数:{func.__name__}")
        result = func(*args, **kwargs)
        print(f"函数调用结束:{func.__name__}")
        return result
    return wrapper


# 使用装饰器修饰函数
@my_decorator
def add_numbers(a, b):
    return a+b


print(add_numbers(5, 6))
调用函数:add_numbers
函数调用结束:add_numbers
11

1.2用类的形式创建装饰器

# 使用类作为装饰器
class my_decorator_class:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args: Any, **kwds: Any) -> Any:
        print(f'{self.func.__name__}被执行')
        ret = self.func(*args, **kwds)
        print(f'{self.func.__name__}执行完毕')
        return ret

# 使用装饰器修饰函数
@my_decorator_class
def add_numbers(a, b):
    return a+b

print(add_numbers(5, 6))
add_numbers被执行
add_numbers执行完毕
11

  这种方式使用类实现装饰器时,装饰器类的实例可以像函数一样被调用,因为它实现了 call() 方法。这使得装饰器类的用法与函数装饰器非常类似。

2.装饰器的应用

当谈到装饰器的应用时,以下是一些常见的示例:

2.1日志记录

class LOG_Decorator:
    def __init__(self, func) -> None:
        self.func = func

    def __call__(self, *args: Any, **kwds: Any) -> Any:
        print(f'{self.func.__name__}函数正在被执行...')
        ret = self.func(*args, **kwds)
        print(f'{self.func.__name__}函数执行完毕!')
        return ret


@LOG_Decorator
def log_test(a, b):
    return a+b


print(log_test(5, 6))
log_test函数正在被执行...
log_test函数执行完毕!
11

  在上述示例中,LOG_Decorator 装饰器用于添加日志记录功能。每次调用log_test函数时,都会在控制台打印函数的调用信息和结束信息。

2.2程序计时器

class TIME_Decorator:
    def __init__(self, func) -> None:
        self.func = func

    def __call__(self, *args: Any, **kwds: Any) -> Any:
        begin_time = time.time()
        ret = self.func(*args, **kwds)
        end_time = time.time()
        print(f'{self.func.__name__}函数执行的时间为:{(end_time-begin_time)*1000}ms')
        return ret


@TIME_Decorator
def time_test(count, a, b):
    total = 0
    for i in range(count):
        total += a*b
    return total


print(time_test(1000000, 5, 600))
print(time_test(2000000, 50, 60))
time_test函数执行的时间为:65.7963752746582ms
3000000000
time_test函数执行的时间为:132.7962875366211ms
6000000000

  在上述示例中,TIME_Decorator 装饰器用于计算函数执行的时间。每次调用 time_test 函数时,都会在控制台打印函数的执行时间。

2.3缓存

class CACHE_Decorator:
    def __init__(self, func) -> None:
        self.func = func
        self.cache = {}

    def __call__(self, *args: Any, **kwds: Any) -> Any:
        if args in self.cache:
            return self.cache[args]
        else:
            ret = self.func(*args, **kwds)
            self.cache[args] = ret
            return ret


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


result = fibonacci(10)
print(f"结果:{result}")

  在上述示例中,CACHE_Decorator 装饰器用于添加缓存功能,以提高斐波那契数列计算的效率。每次调用 fibonacci 函数时,都会检查是否已经计算过相同的参数,并从缓存中获取结果。如果没有缓存,则计算并将结果存储在缓存中,以供后续使用。

  这些是装饰器的一些常见应用示例,通过装饰器可以轻松地为函数添加额外的功能或修改行为,提高代码的可读性和可维护性。装饰器的应用场景非常广泛,可以根据具体需求进行自定义。

05-30 20:42