结合了Aaron使用装饰器的想法和Ignacio的类维护维护附加回调列表的类的想法,再加上从C#借用的概念,我想到了:
class delegate(object):
def __init__(self, func):
self.callbacks = []
self.basefunc = func
def __iadd__(self, func):
if callable(func):
self.__isub__(func)
self.callbacks.append(func)
return self
def callback(self, func):
if callable(func):
self.__isub__(func)
self.callbacks.append(func)
return func
def __isub__(self, func):
try:
self.callbacks.remove(func)
except ValueError:
pass
return self
def __call__(self, *args, **kwargs):
result = self.basefunc(*args, **kwargs)
for func in self.callbacks:
newresult = func(result)
result = result if newresult is None else newresult
return result
使用修饰功能@delegate
可以将其他功能“附加”到该功能。
@delegate
def intfactory(num):
return int(num)
可以使用添加函数+=
(使用删除-=
)。您还可以装饰funcname.callback
以添加回调函数。
@intfactory.callback
def notify(num):
print "notify:", num
def increment(num):
return num+1
intfactory += increment
intfactory += lambda num: num * 2
print intfactory(3) # outputs 8
这听起来像Pythonic吗?