Import 如何仅在需要时导入模块?

Import 如何仅在需要时导入模块?,import,python-2.7,Import,Python 2.7,我正在为gupshup、nexmo、redrabitt等服务提供商编写不同的python模块 #gupshup.py class Gupshup(): def test(): print 'gupshup test' 所有其他模块都有test()方法,其中包含不同的内容。我知道要调用谁的test()。我想写另一个模块提供程序,它看起来像- #provider.py def test(): #call test() from any of the provider

我正在为gupshup、nexmo、redrabitt等服务提供商编写不同的python模块

#gupshup.py
class Gupshup():
    def test():
        print 'gupshup test'
所有其他模块都有test()方法,其中包含不同的内容。我知道要调用谁的test()。我想写另一个模块提供程序,它看起来像-

#provider.py
def test():
    #call test() from any of the providers
我将传递一些sting数据作为命令行参数,该参数将具有模块的名称


但是我不想使用
import providers.*
导入所有模块,然后调用
providers.gupshup.test()之类的方法。只要知道我将在运行时调用谁的test(),当我想调用nexmo模块的测试方法时,如何只加载nexmo模块?

如果模块名称是字符串,则可以根据需要导入所需的模块:

from importlib import import_module

# e.g., test("gupshup")
def test(modulename):
    module = import_module(module_name)
    module.test()
import\u module
采用可选的第二个参数,指定要从中导入模块的包

如果还需要从模块中获取类以获取测试方法,则可以使用
getattr
从模块中获取该类:

# e.g., test("gupshup", "Gupshup")
def test(modulename, classname):
    module = import_module(module_name)
    cls = getattr(module, classname)
    instance = cls()  # maybe pass arguments to the constructor
    instance.test()

该死,你在干什么?你回避类的理由毫无意义,你所追求的仍然是多态性(只是没有继承),你仍然使用继承和类,委托类没有存在的理由,整个事情通常是混乱的。我可以建议你退一步,描述一下你试图解决的实际问题吗?我想把汽车、自行车、卡车分类放在单独的文件中。因此,当我需要添加车辆时,我会将一个文件添加到包含这些类的文件夹中。我知道我将调用谁的方法-move()。汽车、自行车或卡车。但是我不想导入所有的类,然后执行Car.move()。嗯。。。我仍然不确定你的问题是什么,但是:(1)你可以在你想要的任何文件(模块)中放入任意多的类。一个模块中可以有多个类,可以让它们分布在不同的项目中,等等。(2)不需要为此导入所有类。但您至少需要具体类及其超类(显然;否则,您将如何继承任何内容?)。(3) 如果你不需要继承任何东西,那就不要继承。你不一定需要一个超类;用鸭子打字!我是否应该删除这个问题,因为它似乎令人困惑,并写一个新的?你可以编辑它。不过如果你花点时间思考和重读可能会有所帮助。太好了。这就行了+1表示getattr方法。嘿。尝试使用包名为第二个参数的导入模块。它不起作用。did
module=import\u模块(模块名称“providers”)
其中providers是包含模块gupshup的包。请注意,providers包位于provider.py所在的文件夹中。您好,当我执行
print\uuuuu-package\uuuuuu
时,它会显示
None
。请参考我之前的评论。我已将
import\u模块
放入文件provider.py中。我在provider.py的同一目录中有一个文件夹providers。这个providers文件夹是我的包,我已经在里面放了_init_upy.py。我有我的模块gupshup.py、nexmo.py、redrabbit.py等等。在此软件包中,但无法导入它们。在具有
test
功能的模块中,是否可以
import-gupshup
import-providers.gupshup
?是。设置
$PYTHONPATH
后,我可以执行
导入gupshup
从提供者导入gupshup
,并将gupshup导入到与模块相同的目录中。