模块是用来组织python代码的方法,而包则是用来组织模块的。
一个文件被看作一个独立的模块,一个模块也可以被看作是一个文件。模块的文件名就是模块的名字加上扩展名.py。
一个名称空间就是一个从名称到对象的关系映射集合。
模块的导入需要一个叫做“路径搜索”的过程。
搜索路径在不同系统下一般是不同的。
使用sys.modules可以找到当前导入了哪些模块和它们来自什么地方。
和sys.path不同,sys.modules是一个字典,使用模块名作为键(key),对应物理地址作为值(value)。
改变了一个名字的绑定叫做重新绑定,删除一个名字叫做解除绑定。
python解释器首先加载内建名称空间。随后加载执行模块的全局名称空间,他会在模块开始执行后变为活动名称空间。
如果在执行期间调用了一个函数,那么将创建出第三个名称空间,即局部名称空间。可以通过globals()和locals()内建函数判断出某一名字属于哪个名称空间。
首先从局部名称空间开始,如果没有找到,解释器将继续查找全局名称空间。如果这也失败了,它将在内建名称空间里查找。
推荐导入模块的顺序:
1、标准库模块
2、第三方模块
3、应用程序自定义模块
加载模块会导致这个模块被“执行”。也就是被导入模块的顶层代码将直接被执行。
应该把尽可能多的代码封装到函数。
python加入的一个新特性允许你把一个已经安装的模块作为脚本执行。
一个模块只被加载一次,无论它被导入多少次。加载只在第一次导入时发生。
只从模块导入名字的另一个副作用是那些名字会成为局部名称空间的一部分。绑定只是局部的而不是整个名称空间。
解决办法是使用import和完整的标识符名称。
只import__future__不会有任何变化。必须显示地导入指定特性。
程序员应该有从python程序或是C中发布警告的能力。
警告会有一个默认的输出显示到sys.stderr。当运行会引发警告的python脚本时,可以jilu它的输出记录到日志文件中,而不是直接显示给终端用户。python还提供一个可以操作警告过滤器的API。
命令行也可以控制警告过滤器。
如果你的搜索路径中存在一个包含python模块的.zip文件,导入时会zip文件当作目录处理,在文件中搜索模块。
如果一个zip归档没有匹配的.pyc文件时,导入速度会相对慢一点。
__import__(module_name[,globals[,locals[,fromlist]]])
sys=__import__('sys')
globals()和locals()内建函数分别返回调用者全局和局部名称空间的字典。
在全局名称空间下,globals()和locals()返回相同的字典。
reload()内建函数可以重新导入一个已经导入的模块。首先模块必须是全部导入,而且必须是被成功导入。另外参数必须是模块自身而不是包含模块名的字符串。
模块中的代码在导入时被执行,但只执行一次。以后执行import语句不会再次执行这些代码,只是绑定模块名称。而reload()函数不同。
包是一个有层次的文件目录结构,它定义一个由模块和子包组成的python应用程序执行环境。包使用句点属性标识来访问他们的元素。使用标准的import和form-import语句导入包中的模块。
__init__.py 初始化模块
from-import语句导入子包时需要使用到它。如果没有用到,他们可以是空文件。
所有的导入现在都被认为是绝对的,也就是说这些名字必须通过python路径来访问。
相对导入只应用于from-import语句。
当python解释器在标准模式下启动时,一些模块会被解释器自动导入,用于系统相关操作。
如果你不想让某个模块属性被“from module import *”导入,那么你可以给你不想导入的属性名称加上一个下划线。不过如果你导入了整个模块或是你显式地导入某个属性,这个隐藏数据的方法就不起作用。
本文转自Grodd51CTO博客,原文链接:http://blog.51cto.com/juispan/1960333,如需转载请自行联系原作者