📜  说明Python中装饰器的有用案例(1)

📅  最后修改于: 2023-12-03 15:28:10.778000             🧑  作者: Mango

说明Python中装饰器的有用案例

Python中装饰器是一种在运行时动态增加函数功能的方式,通过定义一个函数来装饰其他函数,使得被装饰函数能够在不改变原有代码的情况下增加新的功能。本文将介绍Python中装饰器的几种有用案例。

1. 计时器装饰器

计时器装饰器可以用来计算函数的运行时间,该装饰器可以应用于任意函数。

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print('{} function took {:.2f} s'.format(func.__name__, end_time - start_time))
        return result
    return wrapper

@timer
def my_function():
    # 模拟函数执行
    time.sleep(2)

my_function() # my_function function took 2.00 s
2. 缓存装饰器

缓存装饰器可以用来缓存函数的计算结果,如果下次调用该函数时参数相同,直接返回缓存的结果,避免重复计算。

def cache(func):
    memo = {}

    def wrapper(*args):
        if args not in memo:
            memo[args] = func(*args)
        return memo[args]
    return wrapper

@cache
def fibonacci(n):
    if n in (0, 1):
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10)) # 55
3. 日志装饰器

日志装饰器可以用来记录函数的输入和输出,方便调试和分析。

def logger(func):
    def wrapper(*args, **kwargs):
        args_str = ', '.join(map(str, args))
        kwargs_str = ', '.join('{}={}'.format(k, v) for k, v in kwargs.items())
        signature = '{}({}{})'.format(func.__name__, args_str, kwargs_str)
        result = func(*args, **kwargs)
        print('{} -> {}'.format(signature, result))
        return result
    return wrapper

@logger
def my_function(x, y):
    return x * y

my_function(2, 3) # my_function(2, 3) -> 6
4. 链式装饰器

如果需要同时应用多个装饰器,可以使用链式装饰器,即将多个装饰器串联起来,形成一个新的装饰器。

def decorator1(func):
    def wrapper(*args, **kwargs):
        print('decorator1: before')
        result = func(*args, **kwargs)
        print('decorator1: after')
        return result
    return wrapper

def decorator2(func):
    def wrapper(*args, **kwargs):
        print('decorator2: before')
        result = func(*args, **kwargs)
        print('decorator2: after')
        return result
    return wrapper

@decorator1
@decorator2
def my_function():
    print('my_function')

my_function()
# decorator1: before
# decorator2: before
# my_function
# decorator2: after
# decorator1: after

以上是Python中装饰器的几个有用的例子,通过装饰器,可以将不同的功能注入到函数中,使程序更加灵活和可扩展。