阅读目录
模块
导入模块完成的三件事
起别名
模块分类
模块的加载顺序
环境变量
from.....import 语法导入
from.....import *
链式导入
循环导入
##模块
# 1、什么是模块:一系列功能的集合体,我们的程序可以导入模块来复用模块里的功能 # 2、为什么会出现模块:很多相似的功能,要统一管理,将这些功能放在一个文件中,该文件就是管理这些功能的集合体,我们命名为模块,拿来主义,提升开发效率。 # 3、怎么使用模块 # -- 在要使用模块功能的文件中导入模块:import 模块名 - 模块名:用来管理一系列功能的文件名 # 4、在哪使用模块 # -- 在所有要使用模块中功能的文件中导入并使用模块 #常见的四种模块:module #1.使用python编写的.py文件 #2.把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包) #3.使用C编写并链接到python解释器的内置模块 #4.已被编译为共享库或DLL的C或C++扩展
##导入模块完成的三件事
# 首次导入 import 模块名 # 1.将被导入的模块编译形成对应的pyc文件 # 2.进入模块,从上执行执行模块中的代码,将产生的所有名字存放在该模块文件的全局名称空间中 # 3.在使用模块的文件中,产生一个与模块名(模块文件名)同名的名字,指向模块的全局名称空间 # 再次导入 # 不再执行导入模块的前两步,只会走第三步:在当前模块中产生一个名字,指向第一次导入在内存中产生的全局名称空间
##起别名
import 模块名 as 别名 # 重点:导入一旦起别名,原模块名变量失效,本质只产生了别名变量指向模块文件的全局名称空间
#mysql.py
def sqlparse():
print('from mysql sqlparse')
#oracle.py
def sqlparse():
print('from oracle sqlparse')
def sqlparse():
print('from mysql sqlparse')
#oracle.py
def sqlparse():
print('from oracle sqlparse')
#test.py
db_type=input('>>: ')
if db_type == 'mysql':
import mysql as db
elif db_type == 'oracle':
import oracle as db
db_type=input('>>: ')
if db_type == 'mysql':
import mysql as db
elif db_type == 'oracle':
import oracle as db
db.sqlparse()
##模块分类
# 大方向:内置(built-in) | 自定义(系统提供 | 第三方提高 | 自己自定义)
##模块的加载顺序
# 内存 > 内置 > sys.path (安装环境变量中路径的先后顺序逐一加载)
##环境变量
# 环境变量:存放路径的list,第一位默认一定是当前执行文件所在的路径 import sys # sys.path就是环境变量 # 清空环境变量:所有导入都不能使用了 sys.path.clear() # 添加指定路径到环境变量 sys.path.append() sys.path.insert()
##绝对导入和相对导入
#绝对导入:已执行文件的sys.path为起始点开始导入,称之为绝对导入 优点:执行文件与被导入的模块中都可以使用 缺点:所有导入都是以sys.path为起始点,导入麻烦 #相对导入:参照当前所在文件的文件夹为起始开始查找,称之为相对导入 符号: .代表当前所在文件的文件夹 ..代表上一级文件夹 ... 代表上一级的上一级文件夹 优点:导入更加简单 缺点:只能在被导入的模块中使用,不能再执行文件中用
##from.....import 语法导入
# 导入完成的三件事 # 1.将被导入的模块编译形成对应的pyc文件 # 2.进入模块,从上执行执行模块中的代码,将产生的所有名字存放在该模块文件的全局名称空间中 # 3.在导入模块的文件中形成(一个或多个)名字指向模块全局名称空间中的(一个或多个)具体名字 from 模块名 import 模块中的名字1, ..., 模块中的名字n from 模块名 import 名字 as 别名 # from...import导入依赖环境变量 sys.path
##from.....import *
# 模块中默认会添加 __all__ ,__all__ 就是管理模块中能被 * 导入的变量们 # __all__可以自定义,自定义 * 能导入的变量们, __all__的list中名字全部可以自定义 __all__ = ['a', 'b', 'c', 'd_', '_e'] # 系统默认添加的__all__中不会纳入 _开头的名字 # -- 所以默认在外界通过from...import *无法导入_开头的名字 # -- _开头的名字对from...import *是隐藏的,指名道姓依然可以被外界导入使用
##链式导入
# t1导入m1,m1导入m2,m2导入m3 # 执行流程:右键执行t1,在t1导入m1模块的地方直接进入m1,去执行m1,同理在m1执行过程中遇到导入m2,会马上进入m2,去执行m2,一直到m3,m3执行完毕,会回到m2中导入m3的语句,接着往下执行m2,m2执行完毕回到m1,以此类推返回到t1 # 在整个执行流程中,遇到任何模块的二次导入,都是直接引用内存中的名称空间,不会再次进入模块
##循环导入
# 循环导入的问题点:名字没有产生就使用名字 # 解决循环导入:先产生名字,在导入模块 # -- 将会产生循环导入的模块,导入语法延后 - 延后导入 # 问题 # m1.py import m2 print(m2.y) x = 666 # m2.py import m1 print(m2.x) y = 888 # 解决 # m1.py x = 666 import m2 print(m2.y) # m2.py y = 888 import m1 print(m2.x)