在python类中导入模块

Pau*_*aul 53 python import module class

我目前正在编写需要一个类os,stat和其他一些人.

在我班上导入这些模块的最佳方法是什么?

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

现在我用我的方法导入它们,但也许有更好的解决方案.

agf*_*agf 42

如果您的模块将始终导入另一个模块,请始终将其作为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()
Run Code Online (Sandbox Code Playgroud)

如果您只希望在实例化类时导入它,请在__new__或中执行__init__.

  • 如果我在方法中导入模块(例如`__init__`),如果我创建多个实例,它不会多次导入该模块吗?因此,与全球导入相比,它会影响性能吗? (9认同)
  • @Samuel:谢谢你的修正,我修复了导入.如果您希望导入的对象全局可用,只需使用普通的`import`语句即可.然而,这对于条件导入来说并不是一个好主意,因为你可以在*之外的代码*条件只有在导入条件的分支首先执行时才有效.如果您使用上面的`__import__`,则可以避免为对象创建全局名称. (2认同)

小智 12

进口PEP 8:

导入总是放在文件的顶部,就在任何模块注释和文档字符串之后,以及模块全局变量和常量之前.

这样可以轻松查看手头文件使用的所有模块,并避免在多个位置使用模块时在多个位置复制导入.其他一切(例如函数/方法级别的导入)应该是一个绝对的例外,并且需要很好地证明其合理性.

  • 这适用于__unconditional imports__.如果您只想在实例化该类时导入它们,显然这不适用. (11认同)

nvd*_*nvd 8

import sys
from importlib import import_module

class Foo():

    def __init__(self):

        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)
Run Code Online (Sandbox Code Playgroud)