我可以创建一个使用模块进口商提供的功能的模块吗?
我想编写通用代码而不指定几个关键功能的实现。我希望用户指定这些。我可以将这些作为所有函数的输入,但这看起来很难看。
如果我正在编写一个对象,我将创建一个抽象类。模块有等价物吗?
编辑:我特别询问如何使用模块中的函数而不是类中的方法来做到这一点。
可以在运行时给模块打补丁并为模块添加新功能。
import my_module
def my_implementation():
pass
my_module.implementation = my_implementation
然而,这在 Python 社区中是不受欢迎的。它本质上是不稳定的,因为这会影响该模块的所有用户。例如,如果您使用的另一个模块也使用了您已修补过的模块,那么您的另一个模块可能会显示出难以调试的不稳定行为。
对于你想做的事情,你最好创建一个抽象类:-)
如果您在一个模块中执行此操作,那么如果有一天在同一个程序中,一个模块想要将您的通用模块与实现一起使用,而另一个模块想要将它与另一个模块一起使用,那么您将遇到问题。
解决方案是编写一个模块,该模块主要包含一个提供所需服务的类。
例如,查看“随机”模块。所有模块函数,如“randint”、“uniform”、“gauss”,实际上都绑定到 random.Random 类的隐藏实例的方法。但是您也可以使用自己的 Random 类实例,或者通过重新定义一些关键方法来对其进行子类化,以更改生成随机数的方式,但保留所有有用的方法。