# -*- 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 举报,一经查实,本站将立刻删除。