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