模块
模块的本质:.py文件,封装代码的最小单位。
一个模块模块中的代码不宜过多。代码太多读取代码的耗时太长。代码太多会导致代码不容易维护
通常把常用地相似的功能放在同一个模块中
模块化,可以提高开发效率,便于管理维护
自定义模块:自定义.py文件
系统导入模块时的先后顺序:
1.内存中:如果之前成功导入过某个模块,那么这个模块会存储在内存中,那么就直接使用已经在内存中存在的模块。
3.sys.path:是一个路径的列表
第一次引用一个模块,会在内存中查找有没有这个模块,没有就会将这个模块里的代码加载到内存中,只要程序没有结束,接下来不管引用这个模块多少次,都不会再次加载,而是直接在内存中寻找。
如果已经存在内存中,就不会再次加载
第一次导入模块执行三件事:
1.在内存中建立一个以该模块命名的名称空间
2.执行此名称空间内所有的可执行代码
3.通过 "模块名." 的方式引用模块中的变量
import sys # 只在第一次导入时才执行sys内的代码,将sys加载到内存中,后面再次引用时不会再执行了 import sys import sys print(sys.modules) # 可以输出已经加载的模块。sys.modules是一个字典,内部包含模块名与模块对象的映射。该字典决定了导入模块时是否需要重新导入
# a.py name = 'tony' def f(): print('这里是a:'+ name) print(id(f),'a.name----->',id(name)) # b.py 执行 b.py import a # 41737480 a.name-----> 39883640 代码执行到这里就会先执行以便a.py中的可执行代码 name = 'jackma' print(a.name) # tony 通过 模块名.属性 取值 a.f() # 这里是a:tony 调用方法
# b.py import a as aaaaa print(aaaaa.name)
import sys,os,re ''' 推荐这种写法 ''' import sys import os import re
from...import...这种方式会在本内存空间中创建一个与被导入的变量同名的变量,
创建的新变量指向的内存地址就是被导入模块中该变量指向的内存地址
#----------- a.py name = 'tony' def f(): print('这里是a:'+ name) # -----------b.py from a import name # 从a.py中导入变量 name from a import f # 导入方法 f print(name) # tony f() # 这里是a:tony ''' 使用from import 方法导入时,如果导入的变量名与本模块中的变量名重复时, 可以使用别名 解决变量名冲突的问题 ''' #----------- a.py name = 'tony' def f(): print('这里是a:'+ name) # -----------b.py from a import name # 相当于在当前py文件中创建了一个变量name ,name指向的内存空间是 a.name的空间 from a import f name = 'robin' # 这里再次创建一个变量name ,并赋值。name就不再指向 a.name的内存空间 print(name) # robin f() # 这里是a:tony # -----------b.py name = 'robin' from a import name from a import f print(name) # tony f() # 这里是a:tony ''' from ... import * 默认情况下,所有的成员都会被导入 在被导入模块中添加属性__all__,__all__是一个列表,用于表示本模块可以被外界使用的成员。仅在 from ... import * 时生效 ''' # test.py __all__ = ['a','b'] a = 1 b = 2 c = 3 # ts.py from test import * print(a) # 1 print(b) # 2 print(c) # 变量 c 不再__all__列表内,所以不可被导入引用 # ts.py import test print(test.c) # 3 这种方式引用,不受__all__约束