我希望为我的一个模块的用户提供一种扩展功能的能力,即通过提供调用用户函数的接口来扩展其功能。例如,我希望给用户提供在创建类的实例并在使用之前修改实例的机会的能力。
我实现的方式是声明一个模块级别的工厂函数来进行实例化:
# 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这样的模块对我来说似乎过于复杂,特别是后者,但是如果对程序员使用我的模块有强大的好处,我会接受它们。