【问题标题】:Import on class instanciation在类实例化时导入
【发布时间】:2015-06-15 11:30:53
【问题描述】:

我正在创建一个包含多个类的模块。我的问题是其中一些类需要导入非常特定的模块,这些模块需要手动编译或需要特定的硬件才能工作。

没有兴趣预先导入每个特定模块,并且由于某些模块需要特定硬件才能工作,它甚至可能引发错误。

我想知道是否可以仅在需要时导入这些模块,即在精确类的实例化时,如下所示:

class SpecificClassThatNeedRandomModule(object):
    import randomModule

另外,我不确定这是否是一种很好的 Pythonic 方法,所以我愿意接受正确方法的建议。

【问题讨论】:

  • 我不认为将 import 语句放在类定义中会像您期望的那样延迟它。但是,您可以在函数中进行导入,然后它只会在第一次调用该函数时发生。
  • 同时检查 how to test if one python module has been imported? 。好东西存在于这些帖子中。

标签: python python-2.7


【解决方案1】:

可以在实例化时导入模块:

class SpecificClassThatNeedRandomModule(object):
    def __init__(self):
        import randomModule
        self.random = randomModule.Random()

但是,这是一种不好的做法,因为这样很难知道导入何时完成。您可能想要修改您的模块,使其不会引发异常,或者捕获ImportError

try:
    import randomModule
except ImportError:
    randomModule = None

【讨论】:

  • 虽然这可能是不好的做法;我相信 OP 正试图只导入实际需要或使用的模块。但是对“良好做法”+1。
  • @PadraicCunningham 你不能。你必须这样做:if randomModule:
【解决方案2】:

您需要在类的构造函数中“导入”:

示例:

class SpecificClassThatNeedRandomModule(object):

    def __init__(self, *args, **kwargs):
        import randomModule

        self.randomModule = randomModule  # So other methods can reference the module!

【讨论】:

  • 你是对的,但是如果你想在实例的其他功能中使用你的模块,你需要添加self.randomModule=randomModule。无论如何感谢您的回答!
猜你喜欢
  • 2016-01-22
  • 2022-06-23
  • 2018-06-12
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多