模块
一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀
模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行
我们可以从sys.modules中找到当前已经加载的模块,sys.modules是一个字典,内部包含模块名与模块对象的映射,该字典决定了导入模块时是否需要重新导入。
冲突问题
每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,
这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突
首次导入模块my_module时会做三件事
1为源文件创建名称空间
2在新创建的命名空间中执行模块中包含的代码
3创建变量指向该空间
为模块起别名
if file_format == 'xml': import xmlreader as reader elif file_format == 'csv': import csvreader as reader data=reader.read_date(filename)
一行可以导入多个模块,但不建议这么做
from ... import ...
from 语句相当于import,也会创建新的名称空间,但是将my_module中的名字直接导入到当前的名称空间中,
在当前名称空间中,直接使用名字就可以了
python中的变量赋值不是一种存储操作,而只是一种绑定关系
注意 * 与 __all__['字符串类型的变量名']
模块的循环引用问题 可以循环 但不建议,会出问题
我们可以通过模块的全局变量__name__来查看模块名: 当做脚本运行: __name__ 等于'__main__' 当做模块导入: __name__= 模块名 作用:用来控制.py文件在不同的应用场景下执行不同的逻辑 if __name__ == '__main__':
模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块
包