加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 10:56:16 所属栏目:Python 来源:网络整理
导读:? # -*- coding: utf-8 -*- # author:baoshan # python对某个对象是否能通过装饰器形式使用只有一个要求:decorator必须是一个可被调用的对象。 # 我们最熟悉的就是函数了 # 除函数之外,类也可以是callable对象,只要实现了__call__函数。 # 如下DelayFunc

?

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

?

谢谢!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读