Python只在一个类中导入模块

5 投票
3 回答
8256 浏览
提问于 2025-04-16 08:44

我想在调用特定类的对象时才导入一个模块。比如说:

class One(object):
    try:
        import OneHelper
    except ImportError:
        pass
    def __init__(self):
        # this function doesn't use OneHelper
        ...

    def blah(self):
        # this function does
        OneHelper.blah()

当调用One.blah()这个函数时,会出现一个NameError: global name 'OneHelper' is not defined的错误。目前我发现的唯一有效的方法是把模块导入到实际使用它的函数里。所以:

class One(object):
    def __init__(self):
        # this function doesn't use OneHelper
        ...

    def blah(self):
        try:
            import OneHelper
        except ImportError:
            pass
        # this function does
        OneHelper.blah()

但我不想在每个需要用到这个模块的函数里都导入它,我希望它对整个类都可用,但只有在实例化这个类的时候才导入。抱歉如果我没有说清楚……

3 个回答

0

你也可以考虑在导入模块之前使用 global OneHelper。这样做会把 OneHelper 加入到全局命名空间中。

2

__init__文件中导入它,并把它赋值给某个属性:

class One(object):
    def __init__(self):
        try:
            import OneHelper
        except ImportError:
            self.OneHelper = None
        else:
            self.OneHelper = OneHelper
    def blah(self):
        if self.OneHelper:
            self.OneHelper.blah()

你的例子看起来有点奇怪,因为如果模块导入失败,那之后再调用它有什么意义呢?

7

在这个类里面,import OneHelper 是可以正常工作的,这样就把它变成了一个类的属性。你可以在定义完类之后,用 dir(One) 来检查一下——你会看到有一个 OneHelper 属性。One.OneHelper 是对这个模块的引用。当然,在实例中,你可以通过方法里的 self.OneHelper 来访问它。(你也可以继续用 One.OneHelper 来访问。)

撰写回答