在Python类中导入模块

问题描述 投票:0回答:4

我目前正在编写一个需要

os
stat
和其他一些内容的课程。

在我的班级中导入这些模块的最佳方式是什么?

我正在考虑其他人何时会使用它,我希望“依赖”模块已经存在 实例化类时导入。

现在我将它们导入到我的方法中,但也许有更好的解决方案。

python class import module
4个回答
58
投票

如果您的模块始终导入另一个模块,请始终将其放在顶部,如 PEP 8 和其他答案所示。另外,正如 @delnan 在评论中提到的,

sys
os
等无论如何都在使用,所以在全球范围内导入它们并没有什么坏处。

但是,如果您确实只在某些运行时条件下需要一个模块,那么条件导入没有任何问题。

如果您只想在类是已定义时导入它们,例如该类位于条件块或另一个类或方法中,您可以执行以下操作:

condition = True

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

    C.os
    c = C()

如果您只想在类被实例化时导入它,请在

__new__
__init__
中进行。


23
投票
import sys
from importlib import import_module

class Foo():

    def __init__(self):

       moduleName = "myLovelyModule"

        # If conditional importing is needed, a variable updated
        # from the configuration of the application can be used.
        self.importTheModule = True # "True" Or "False"

        self.importedModule = None

        if self.importTheModule:
            self.importedModule = import_module(moduleName)

        # ---
        # Usage:

        if self.importedModule is not None:
            self.importedModule.functionA(params)

        # or

        if moduleName in sys.modules:
            self.importedModule.functionA(params)

        # or

        if self.importTheModule:
            self.importedModule.functionA(params)
        # ---

16
投票

PEP 8 进口:

导入始终放在文件顶部,紧接在任何模块之后 注释和文档字符串,以及模块全局变量和常量之前。

这使得您可以轻松查看手头文件使用的所有模块,并避免在多个位置使用模块时必须在多个位置复制导入。其他所有内容(例如函数/方法级导入)都应该是绝对例外,并且需要充分证明其合理性。


1
投票

This(搜索“导入”部分)官方文件指出,

import
通常应放在源文件的顶部。除了特殊情况,我会遵守这条规则。

© www.soinside.com 2019 - 2024. All rights reserved.