0

我想根据某些条件在我的类中动态导入模块。

    class Test(object):
        def __init__ (self,condition):
            if condition:
                import module1 as mymodule
            else:
                import module2 as mymodule

            self.mymodule = mymodule

        def doTest(self):
            self.mymodule.doMyTest

其中 module1 和 module2 以不同的方式实现 doMyTest 。

称它为

    mytest1 = Test(true)  # Use module1
    mytest2.doTest()

    mytest2 = Test(false)  # Use module2
    mytest2.doTest()

这可行,但可能有更惯用的方式吗?有没有可能的问题?

4

1 回答 1

1

当然通常你不想在__init__方法中间导入模块,但是测试类是该规则的一个明显例外,所以让我们忽略这部分并假设你在顶层执行此操作:

if test_c_implementation:
    import c_mymodule as mymodule
else:
    import py_mymodule as mymodule

这是完全地道的。事实上,您会在标准库中看到类似的代码以及核心开发人员编写的其他代码。

除了在非常常见的EAFP情况下,条件只是为了避免异常,在这种情况下,这样做更习惯:

try:
    import lxml.etree as ET
except ImportError:
    import xml.etree.cElementTree as ET
于 2013-08-20T19:55:24.000 回答