我目前正在编写一个需要os
,stat
和其他一些的类。在Python类中导入模块
在我的课堂上导入这些模块的最佳方式是什么?
我在考虑什么时候别人会使用它,我希望'依赖'模块已经在类实例化时导入了 。
现在我将它们导入到我的方法中,但也许有更好的解决方案。
我目前正在编写一个需要os
,stat
和其他一些的类。在Python类中导入模块
在我的课堂上导入这些模块的最佳方式是什么?
我在考虑什么时候别人会使用它,我希望'依赖'模块已经在类实例化时导入了 。
现在我将它们导入到我的方法中,但也许有更好的解决方案。
如果您的模块将始终导入另一个模块,请始终将其置于顶部,作为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__
。
This(搜索“Imports”部分)正式文件状态,通常应该将import
放在源文件的顶部。除特殊情况外,我会遵守这条规则。
进口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.
这可以很容易地看到手边的文件中使用的所有模块,并避免了复制在几个地方进口时,模块在一个以上的地方使用。其他一切(例如,函数/方法级别的导入)都应该是一个绝对的例外,并且需要合理化。
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)
如果我在一个方法中导入一个模块(比如'__init__'),如果我创建了多个实例,它会不会多次导入该模块?因此,与全球进口相比,它会不会影响性能? –
不应该(_)在__import之后,而不是[]?当我使用括号时,出现“TypeError:'builtin_function_or_method'对象没有属性'__getitem__''的错误。在我将它改为()后,它可以工作,但是我必须在导入的模块前加上类的名称,即使在类中使用导入的模块时,我宁愿不这样做。任何方式在这个? – Samuel
@Samuel:感谢您的纠正,我确定了导入。如果你希望导入的对象全局可用,只需使用普通的'import'语句即可。虽然这对于条件输入来说并不是一个好主意,因为你可以在外部有代码*这个条件只有在带有条件的条件分支首先执行时才有效。如果你像上面那样使用'__import__',你可以避免为该对象创建一个全局名称。 – agf