加载模块和初始化模块之间的区别?

时间:2017-07-25 18:42:38

标签: python python-3.x module python-internals

reference manual中声明:

  

完整的Python程序在最低限度初始化的环境中执行:所有内置和标准模块都可用,但没有一个已经初始化,除了sys(各种系统服务),builtins(内置函数,例外和无)和__main__

我不确定"初始化"应该在这里意味着什么。如果模块已加载并存在于sys.modules中,我一直认为模块已初始化:

  

这是一个将模块名称映射到已加载的模块的字典。

显然,我错了,因为sys.modules包含许多其他模块:

python -c "import sys; print(sys.modules.keys() - {'sys', 'builtins', '__main__'})"
{'_stat', 'encodings.aliases', '_sitebuiltins', '_thread', 'io', '_weakrefset', 'genericpath', 'encodings.utf_8', 'codecs', 'os', '_weakref', '_codecs', '_frozen_importlib', '_io', '_frozen_importlib_external', 'os.path', '_warnings', '_bootlocale', '_signal', 'errno', '_imp', 'encodings.latin_1', 'sysconfig', 'marshal', 'encodings', 'usercustomize', 'site', 'posixpath', '_collections_abc', 'posix', '_sysconfigdata_m_linux_x86_64-linux-gnu', 'encodings.cp437', 'abc', 'zipimport', 'stat', '_locale'}

初始化和加载模块之间有什么区别?我是关于Python 3的。

2 个答案:

答案 0 :(得分:4)

自编写文档以来,语言初始化变得更加复杂。 (至少Python 1.4以来它几乎没有变化。)sys.modules中的所有模块都已完全加载并初始化。

答案 1 :(得分:-1)

简单地说:

import将模块加载到内存中。

当你在模块中调用一个类并使用.__init__()函数时,属于这个模块的类中的某些属性得到更新,那么这个模块就变成了一个初始化的模块。

请注意,当您使用该模块时,此过程会隐式发生。

TL; DR

import some_module加载模块, some_module.some_attribute/function初始化它。