python装饰器的另一种写法


python装饰器的另一种写法

import time
import functools


class DelayFunc:
    def __init__(self, duration, func):
        self.duration = duration
        self.func = func

    def __call__(self, *args, **kwargs):
        print("delayed:", self.duration)
        time.sleep(self.duration)
        return self.func(*args, **kwargs)

    def eager_call(self, *args, **kwargs):
        print('Call without delay')
        return self.func(*args, **kwargs)


def delay(duration):
    """装饰器:推迟某个函数的执行。同时提供 .eager_call 方法立即执行
    """
    return functools.partial(DelayFunc, duration) 


1 不用装饰器

    def add(a, b):
        return a + b
    
    DelayFunc(2, add)(1,2)
    DelayFunc(2, add).eager_call(1, 2)
    
    # 这里的 delay(2) <==> DelayFunc(2, add)
    # 然后(), 调用 DelayFunc类的 __call__ 方法 ,这里的 __call__ 实际是个闭包

2) 使用装饰器
    
    @delay(duration=2)
    def add(a, b):
        return a + b
    
    add.eager_call(1, 2)      #     DelayFunc(2, add).eager_call(1, 2)
    
    add(1, 2)                 #     DelayFunc(2, add)(1,2)

参考于python工匠系列

Buy me a 肥仔水!