# -*- 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.com/p/65968462
谢谢!