微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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,**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

 

谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐