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

 

谢谢!

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...