我想为我的某个模块的用户提供能力,通过提供一个调用用户功能的接口来扩展其功能。例如,我想让用户能够在创建类的实例时得到通知,并且有机会在实例使用之前修改实例。在Python中实现钩子或回调的首选方式是什么?
我实现它要声明一个模块级的工厂函数,它实例化的方式:
# in mymodule.py
def factory(cls, *args, **kwargs):
return cls(*args, **kwargs)
后来,当我需要一个MyModule的类的实例,我做factory(cls, arg1, arg2)
而非cls(arg1, arg2)
。
把它扩大,程序员会在另一个模块中写这样的功能:
def myFactory(cls, *args, **kwargs):
instance = myFactory.chain(cls, *args, **kwargs)
# do something with the instance here if desired
return instance
安装上述的回调看起来是这样的:
myFactory.chain, mymodule.factory = mymodule.factory, myFactory
这似乎足够直截了当给我,但是我想知道,作为一名Python程序员,您是否希望函数注册回调函数,而不是使用赋值工具进行注册,或者是否有其他方法。我的解决方案看起来是否可行,惯用且对您清楚?
我期望尽可能简单;例如,我不认为大多数应用程序实际上需要链接多个用户回调(尽管无限制链接是通过上述模式“免费”的)。我怀疑他们需要删除回调或指定优先级或顺序。像python-callbacks或PyDispatcher这样的模块在我看来似乎有点矫枉过正,尤其是后者,但是如果对于使用我的模块的程序员有很大的好处,我会向他们开放。
使用简单的子类来扩展类有什么问题?为什么所有这些混淆回拨业务? – 2010-11-30 03:13:27