一,模块
import:
Q1:在import的过程中发生了哪些事情
相当于执行了这个模块,但是一个模块不能被重复导入
Q2:被导入的模块和本文件之间命名空间的关系
import模块的时候发生的事情
1.寻找模块
2.如果找到了,就开辟一块空间,执行这个模块
3.把这个模块中用到的名字都收录到新开辟的空间中
4.创建一个变量来引用这个模块的空间
导入模块时需要注意:
1.模块不会被重复导入
2.模块和文件之间的内存空间始终是隔离的
3.模块的名字必须是符合变量命名规范的
# 使用被导入模块中的名字 import my_modul2 print(my_module2.name) my_module2.read1() name = 'alex' print(name)
#可以修改模块内变量的指向 import my_module2 my_module2.read12() name = 'alex' my_module2.read12() my_module2.name = 'alex' my_module2.read12()
Q3:导入多个模块的方法
#导入多个模块 import time,os,my_module2 #注意:pep8规范 import time import os import my_module2 #内置,第三方,自定义,规范需要按顺序导入
Q4:给导入的模块起别名
#给模块起别名,起了别名,原来的模块名就不能用 import my_module2 as m print(m.name) print(my_module2.name) #NameError: name 'my_module2' is not defined #应用: def dump(method): if method == 'json': import json as m elif method == 'pickle': import pickle as m with open('file', 'w') as f: m.dump([1,2,3],f)
Q5:模块搜索路径
# 模块搜索路径 import sys print(sys.path) import my_module2 #正常的sys.path中除了内置。扩展模块所在的路径之外 #只有一个路径是永远不会出问题 #你直接执行的这个文件所在的目录,sys.path的第一个是正确的 #sys.path第二个是项目目录,不靠谱 #一个模块是否能被导入,就看这个模块所在的目录在不在sys.path中 import my_module3 #ModuleNotFoundError: No module named 'my_module3' 路径出问题
Q5:模块与脚本的关系
#两种运行一个py文件的方式 #直接运行它:cmd python xx.py pycahrm : 脚本 #执行一个脚本时__name__ ==> '__nain__'
#导入它 :模块 #当这个脚本被当成模块导入时 #__name__ ==> '模块名'
关于:if __name__ == '__main___'
if __name__ == '__main__': 若本作为模块被导入时,将不需要执行的代码放入其中 函数调用和打印操作一般放在此主函数下 若不是直接执行本文件的话,主函数不会被执行
from ... import
Q1.在from import的过程中发生了哪些时期
1.寻找模块
2.如果找到了,就开辟一块空间,执行这个模块
3.把这个模块中用到的名字都收录到新开辟的空间中
4.创建一个变量来引用这个模块的空间
Q2:被导入的内容和本文件之间命名空间的关系
from my_module2 import read1 read1() from my_module2 import read12 #readl2有引用模块内的变量name name = 'alex' #创建一个全局变量并指向'alex' read12() #两个名称空间互相隔绝,不受影响 import sys print(sys.modules) name = 'alex' # 创建一个全局变量并指向'alex' from my_module2 import name #把模块空间内的变量name指向全局变量name print('name')
Q3:from import多个内容,给导入的内容起别名,*和__all__用法
from my_module2 import name,read1,read12 #同时导入多个 from my_module2 import name as n,read1 as r1,read12 as r2 #同时导入多个并重命名 from my_module import * #导入全部,正常情况,该模块内用的小的化,不建议使用,可读性差 __all__ = ['name'] #在模块中定义,可跟*配合,有定义的导入后才能用,没定义导入后不能用
补充:
# 补充的内容 #1.pyc文件,pyi文件 * #pyc:被编译好的字节码模块文件,当模块第一次被导入时会产生一个pyc文件,当第二次被导入 #时,就直接执行编译好的pyc模块文件,当模块源码变更时,会重新编译生成pyc文件 #可以提高程序的启动效率,并不能提高执行效率 #pyi:与py后缀差别不大 #2.模块的导入和修改 * import time import my_module2 #导入时就已经在内存加载好,在期间修改模块,程序执行不受影响 print(my_module2.name) time.sleep(10) #在期间修改模 print(my_module2.name) import my_module2 #不能多次导入,不生效 print(my_module2.name)
from importlib import reload #不建议多次reload模块,影响程序执行效率 import time import my_module print(my_module2.name) time.sleep(10) #在期间修改模块 reload(my_module2) #可以重新加载模块 print(my_module2.name) #3.模块的循环引用 **** #当使用循环引用时,会造成两边的模块内的代码还没有加载完成就结束导入,导致引用失败 #可以先单当面引用,待一边加载完成后,再(条件)触发另一边的引用,实现循环引用 #4.dir(模块名) *** import my_module2 print(dir(my_module2)) #可以获取这个模块中的所有名字,并可以利用反射获取
二,包
Q1:什么是包(package)
含有一个__init__.py的文件夹就是一个包
包中通常含有一些py文件
提供一组复杂的功能
在py3中,模块可以相互导入
在py2中,在同一个中的模块才能互相导入
Q2:从包中导入模块
#从包中导入模块 **** import glance2.api.policy #这个形式终点必须是一个模块 # import glance2.api.policy.get #error:点的左边必须是一个包,不能是一个模块 glance2.api.policy.get() import glance2.api.policy as policy #起别名 policy.get() from glance2.api import policy #from import 形式 policy.get() from glance2.api.policy import get get()
Q3:直接导入包 **
# 绝对导入 #导入包的过程发生了什么事? #相当于执行了这个包的__init__.py文件 #sys.path的内容 永远是当期你执行的文件 glance2.api.policy.get() #相对导入 #运用了相对导入的文件不能直接执行 #'.'表示当前目录 #'..'表示上级目录 # import glance3 from outer import glance3