模块
import加载模块四个通用类别
1.使用python编写的代码(py.文件)
2.已被编译为共享库或DLL的C或C++扩展
3.包好一组模块的包
4.使用C编写并链接到python解释器的内置函数
在import模块的时候发生的事情
1.寻找模块
2.如果找到了,就开辟一个空间
3.把这个模块中用到的名字都收录到新开辟的空间中
4.创建一个变量来引用这个模块的空间
关于模块
1.模块不会被重复导入
2.模块与文件之间的内存空间始终是隔离的
3.模块的名字必须是符合变量命名规范的
首次导入模块 my_module时做的三件事
1.为源文件(my_module模块)创建新的名称空间,在my_module中定义的函数和方法若是使用到了global时访问的就是这个名称空间
2.在新创建的命名空间中执行模块中包含的代码,见初始导入import my_module
3.创建名字my_module 来引用该命名空间
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
db_type=input('>>: ') if db_type == 'mysql': import mysql as db elif db_type == 'oracle': import oracle as db db.方法
把模块当作脚本执行
我们可以通过模块的全局变量__name__来查看模块名:
当作脚本运行:
__ name__ 等于’__ main__'
当作模块导入:
__ name__ = 模块名
作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
if __ name__ == ‘__ main__’ def fib(n): a, b = 0, 1 while b < n: print(b, end=' ') a, b = b, a+b print() if __name__ == "__main__": print(__name__) num = input('num :') fib(int(num))
模块搜索路径
模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块
包
1. 无论是import形式还是from…import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法
2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)
3. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件
强调:
1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错
2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包即模块
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import os os.makedirs('glance/api') os.makedirs('glance/cmd') os.makedirs('glance/db') l = [] l.append(open('glance/__init__.py','w')) l.append(open('glance/api/__init__.py','w')) l.append(open('glance/api/policy.py','w')) l.append(open('glance/api/versions.py','w')) l.append(open('glance/cmd/__init__.py','w')) l.append(open('glance/cmd/manage.py','w')) l.append(open('glance/db/models.py','w')) map(lambda f:f.close() ,l) # 创建文件夹和目录
1.凡是在导入时带点的,点的左边都必须时一个包
2.from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#在__init__.py中定义 x=10 def func(): print('from api.__init.py') __all__=['x','func','policy']
绝对导入和相对导入
绝对导入:以文件名(如glance)作为起始
相对导入:用. 或者…的方式最为起始(只能在一个包中使用,不能用于不同目录中)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
在glance/api/version.py #绝对导入 from glance.cmd import manage manage.main() #相对导入 from ..cmd import manage manage.main()
注意:
可以用import导入内置或者第三方模块(已经在sys.path中),但是要绝对避免使用import来导入自定义包的子模块(没有在sys.path中),应该使用from… import …的绝对或者相对导入,且包的相对导入只能用from的形式。