【发布时间】:2011-10-15 05:53:12
【问题描述】:
我目前正在编写一个需要os、stat 和其他一些的类。
在我的班级中导入这些模块的最佳方式是什么?
我正在考虑其他人何时会使用它,我希望“依赖”模块已经存在 在类实例化时导入。
现在我在我的方法中导入它们,但也许有更好的解决方案。
【问题讨论】:
标签: python class import module
我目前正在编写一个需要os、stat 和其他一些的类。
在我的班级中导入这些模块的最佳方式是什么?
我正在考虑其他人何时会使用它,我希望“依赖”模块已经存在 在类实例化时导入。
现在我在我的方法中导入它们,但也许有更好的解决方案。
【问题讨论】:
标签: python class import module
This(搜索“Imports”部分)官方文件指出,imports 通常应该放在源文件的顶部。除了特殊情况,我会遵守这条规则。
【讨论】:
PEP 8 导入:
导入总是放在文件的顶部,就在任何模块之后 cmets 和 docstrings,以及模块全局变量和常量之前。
这使得查看手头文件使用的所有模块变得容易,并且避免了在多个地方使用模块时必须在多个地方复制导入。其他一切(例如函数/方法级别的导入)都应该是一个绝对例外,并且需要很好地证明其合理性。
【讨论】:
python -c "import sys; print sys.modules.keys()")。
如果您的模块将始终导入另一个模块,请始终将其作为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__ 中进行。
【讨论】:
__init__),如果我创建多个实例,它不会多次导入该模块吗?因此,与全局导入相比,它会影响性能吗?
import 语句即可。不过,这对于条件导入来说并不是一个好主意,因为您可以在条件外部设置代码,该条件仅在具有导入的条件分支首先执行时才有效。如果像上面那样使用__import__,就可以避免为对象创建全局名称。
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)
【讨论】: