在Python类中导入模块

82 投票
4 回答
116298 浏览
提问于 2025-04-16 22:27

我现在正在写一个类,这个类需要用到 osstat 以及其他一些模块。

请问在我的类中,导入这些模块的最佳方式是什么呢?

我在考虑其他人使用这个类时,希望在创建这个类的时候,所需的模块能已经被导入。

现在我是在我的方法里导入这些模块,但我觉得可能还有更好的方法。

4 个回答

16

PEP 8 关于导入的规定:

导入的内容总是放在文件的最上面,紧接着模块的注释和文档字符串,然后是模块的全局变量和常量。

这样做的好处是,可以很方便地看到当前文件使用了哪些模块,而且当一个模块在多个地方被使用时,就不需要在不同的位置重复导入。其他情况(比如在函数或方法内部导入)应该是非常少见的,并且需要有充分的理由。

21

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,不知道该如何解决。比如,有人可能在使用某个特定的功能时,发现它并没有按照预期工作。这种情况下,通常需要仔细检查代码,看看是不是哪里出错了,或者是否有遗漏的步骤。

有时候,解决问题的方法就是查阅相关的文档,或者在网上搜索一下,看看其他人是否遇到过类似的问题。社区论坛,比如StackOverflow,就是一个很好的地方,可以找到很多有用的信息和解决方案。

总之,遇到问题时,不要着急,慢慢分析,寻找解决办法,通常就能找到出路。

import sys
from importlib import import_module

class Foo():

    def __init__(self):

       # Depends on the configuration of the application.
        self.condition = True # "True" Or "False"

        if self.condition:
            self.importedModule = import_module('moduleName')

        # ---
        if 'moduleName' in sys.modules:
            self.importedModule.callFunction(params)

        #or

        if self.condition:
            self.importedModule.callFunction(params)
        # ---
55

如果你的模块总是需要引入另一个模块,最好把这个引入放在最上面,就像PEP 8和其他回答所说的那样。此外,正如@delnan在评论中提到的,像sysos这些模块反正都会用到,所以全局引入它们也没什么坏处。

不过,如果你真的只在特定的运行条件下需要某个模块,使用条件引入也是没问题的。

如果你只想在类被定义时引入它,比如这个类在一个条件块里,或者在另一个类或方法中,你可以这样做:

condition = True

if condition:
    class C(object):
        os = __import__('os')
        def __init__(self):
            print self.os.listdir

    C.os
    c = C()

如果你只想在类被实例化时引入它,可以在__new____init__方法中进行引入。

撰写回答