Python使用偏函数与类实现装饰器

 

# -*- coding: utf-8 -*-
# author:baoshan
# python对某个对象是否能通过装饰器形式使用只有一个要求:decorator必须是一个可被调用的对象。
# 我们最熟悉的就是函数了
# 除函数之外,类也可以是callable对象,只要实现了__call__函数。

# 如下DelayFunc是一个实现了__call__的类,delay返回一个偏函数,在这里delay就可以作为一个装饰器


import time
import functools

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

    def __call__(self, *args, **kwargs):
        print('Wait for {duration} seconds...'.format(duration=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方法立即执行
    """
    # 此处为了避免定义额外函数,直接调用functools.partial帮助构造
    return functools.partial(DelayFunc, duration)

@delay(duration=2)
def add(a, b):
    return a + b

print(add)
print('-'*20)
print(add(3,5))
print('-'*20)
print(add.func)

 

输出结果:

<__main__.DelayFunc object at 0x0000029A5B61DA58>
--------------------
Wait for 2 seconds...
8
--------------------
<function add at 0x0000029A627FDD08>

 

参考自:https://zhuanlan.zhihu.com/p/65968462

 

谢谢!

上一篇:vue 获取视频时长


下一篇:PHP如何获取视频总时长与码率等信息