在类初始化期间如何导入模块

时间:2019-12-12 05:31:54

标签: python python-3.x class import

我有一堂课,看起来像这样:

class Foo:
    import_extra = false

    def __init__(import_extra):
        if import_extra:
            self.import_extra = true
            import extra

    def do_thing():
        # do some stuff

        if self.import_extra:
            extra.do_extra_stuff()

该类具有某些取决于extra的功能,但是我希望能够在初次初始化该类时(在运行应用程序开始时发生一次)决定该功能是否可用。不幸的是,我似乎无法弄清楚如何为整个类导入extra以便其他方法可以使用它。

我之所以这样设计,是因为在某些情况下extra模块可能无法导入。 do_thing被频繁调用,因此我希望可以避免将import语句放在此处。 有没有更简单的方法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

我找到了解决问题的方法:

from importlib import import_module

class Foo:
    import_os = False
    os = None
    def __init__(self, imp):
        if imp:
            self.import_os = True
            self.os = import_module('os')
    def do_thing(self):
            print("doing thing")
            if self.import_os:
                print(self.os.devnull) # to verify that os has been imported

# check that it does actually work
print("running foo(false)")
f1=Foo(False)
f1.do_thing()
f2=Foo(True)
print("running foo(true)")
f2.do_thing()

它输出

running foo(false)
doing thing
running foo(true)
doing thing
/dev/null

这正是我想要的功能。

在这里,我使用的是os而不是extra,以便任何人都可以运行它。 这些答案帮助我弄清楚了: