2011-07-28 100 views
36

我目前正在编写一个需要os,stat和其他一些的类。在Python类中导入模块

在我的课堂上导入这些模块的最佳方式是什么?

我在考虑什么时候别人会使用它,我希望'依赖'模块已经在类实例化时导入了 。

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

回答

33

如果您的模块将始终导入另一个模块,请始终将其置于顶部,作为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__

+6

如果我在一个方法中导入一个模块(比如'__init__'),如果我创建了多个实例,它会不会多次导入该模块?因此,与全球进口相比,它会不会影响性能? –

+1

不应该(_)在__import之后,而不是[]?当我使用括号时,出现“TypeError:'builtin_function_or_method'对象没有属性'__getitem__''的错误。在我将它改为()后,它可以工作,但是我必须在导入的模块前加上类的名称,即使在类中使用导入的模块时,我宁愿不这样做。任何方式在这个? – Samuel

+2

@Samuel:感谢您的纠正,我确定了导入。如果你希望导入的对象全局可用,只需使用普通的'import'语句即可。虽然这对于条件输入来说并不是一个好主意,因为你可以在外部有代码*这个条件只有在带有条件的条件分支首先执行时才有效。如果你像上面那样使用'__import__',你可以避免为该对象创建一个全局名称。 – agf

0

This(搜索“Imports”部分)正式文件状态,通常应该将import放在源文件的顶部。除特殊情况外,我会遵守这条规则。

8

进口PEP 8

Imports are always put at the top of the file, just after any module comments and docstrings, and before module globals and constants.

这可以很容易地看到手边的文件中使用的所有模块,并避免了复制在几个地方进口时,模块在一个以上的地方使用。其他一切(例如,函数/方法级别的导入)都应该是一个绝对的例外,并且需要合理化。

+10

这是用于__unconditional imports__。如果你只想导入它们,如果该类被实例化,显然这不适用。 – agf

+0

@agf:尽管有条件导入的原因很少。特别是对于OP使用的模块,这些可能已经被实现使用(尝试'python -c“import sys; print sys.modules.keys()”')。 – delnan

5
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)