# -*- 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测试数据/p/65968462
谢谢!
查看更多关于Python使用偏函数与类实现装饰器的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did172838