【发布时间】:2011-05-17 14:43:24
【问题描述】:
我想通过提供一个接口来调用用户的功能,为我的一个模块的用户提供扩展其功能的能力。例如,我希望让用户能够在创建类的实例时收到通知,并让用户有机会在使用实例之前对其进行修改。
我实现它的方式是声明一个执行实例化的模块级工厂函数:
# 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 之类的模块在我看来有点矫枉过正,尤其是后者,但如果对使用我的模块的程序员有令人信服的好处,我愿意接受。
【问题讨论】:
-
使用简单的子类来扩展类有什么问题?为什么所有这些混乱的回调业务?
标签: python callback hook factory