一, 模块
1. 梗概
什么是模块
有的功能开发者无法自己完成,需要借助已经实现的函数/类来完成这些功能
为什莫要有模块
节省内存 ; 管理分类方法 ; 提供更多功能
模块分为哪几种
内置模块:安装python解释器的时候跟着装上去的那些功能
第三方模块/扩展模块:没在安装python解释器的时候安装的那些功能
自定义模块:自己写的一个通用的功能,就可以把它当做一个模块
import : import 的时候发生了什么 在import的时候命名空间的变换
重命名 一行导入多个模块
from...import... : from import 的时候发生了什么 在import的时候命名空间的变换
重命名 一行导入多个.. from 模块 import * * 和__all__的相关性
2. 模块的创建和导入
模块的名字必须要满足变量名的命名规范
import 文件名 要导入一个py文件的名字,但是不加 .py 后缀名
import相当于执行了这个模块所在的py文件
一个模块不可以重复次导入
导入和使用模块的过程:
模块的重命名:
import 文件名 as 新文件名 (此处并非把改变这个模块的模块名,只是改变了引用的名字)
导入多个模块 需用 , 隔开 (此方式不符合PEP8规范)
导入顺序 : 内置模块 第三方模块 自定义模块
3. from 文件名 import 方法名(from my_module import login)
from import 仍然相当于执行了整个py文件
导入了什么就执行什么,不导入的变量不能使用,但是不导入并不意味着不存在,而是没有建立
文件到模块中其他名字的引用
当模块中导入的方法或者变量和本文件重名的时候,那么这个名字只代表最后一次对他赋值
的那个方法或者变量
在本文件中对全局变量的修改是完全不会影响到模块中的变量引用的
导入多个再重命名 : from 文件名 import 方法名 as 新方法名 , 方法名/变量名 as 新name
from 文件名 import * : 模块内所有的名字都会同名引用
4. __all__ = [' '] 可以控制 * 导入的内容,该内容应写在引号内,(因为此方法需要写在文件首,
所有变量都未定义)
5. 把模块当成脚本运行
运行py文件的两种方式 : 1.以模块的形式运行 2. 直接运行 / 以脚本的形式运行
在编写py文件的时候所有不在函数和类中封装的内容都应该写在
if __name__ == '__main__' : 下面
"__main__" : 获取当前文件的内存地址
import sys import my_module #sys.modules #{'sys':文件的内存地址, 'my_module':my_module的地址, # '__main__':当前执行文件所在地址} #存储了所有导入的文件的名字和这个文件的内存地址
6. 在使用反射自己模块中的内容的时候:
import sys
sys.module[__name__](这句话写在哪个文件里就代表着哪个文件的命名空间)
7. sys.path
一个模块能不能被导入,就看sys.path中是否有这个模块所在的绝对路径
导入不成功:
print(sys.path)
import 模块
修改sys.path
修改 import 语句
import sys lst = __file__.split('/') base_path = '/'.join(lst[:-2]) sys.path.append(base_path) #Python解释器相关 from core import main if __name__ '__main__' 启动一个文件,这个文件通过启动导入其他文件,所有导入的文件是一个程序 由一个Python解释器来解释, 所有的文件都加载到一块内存空间中一些解释器中的全局变量,应该是这个 程序共享
7. pyc编译文件和重新加载模块
当一个文件作为一个脚本被导入时就会在这个文件所在目录的__pycache__下生成一个
编译好的文件为了之后导入这个文件的时候直接读这个编译好的pyc文件就可以节省一
些导入时候的时间
在import 之后再修改被导入的模块程序感知不到,导入文件的行为不会因为源文件的改动
而改变
(importlib.reload() 表示重新加载)
8. 模块的循环引用
在模块导入中,不要产生循环引用问题
如果发生循环导入就会发现明明写在这个模块的方法,显示找不到
二, 包
什么是包 : 集合了一组py文件 提供了一组复杂功能
为什莫要有包 : 当提供的功能 比较复杂,一个py文件写不下的时候
包中有什么
至少拥有一个__init__.py
导入模块
import 包.包.模块
包.包.模块 import 模块
from 包.包 import 模块
导入包(相当于执行了包下面的 __init__.py)
如果希望导入包之后模块能够正常的使用 那么需要自己在init文件中做一些导入,才能保证导入包时能够
使用这个包中的模块
绝对导入;
相对导入
使用了相对导入的模块只能被当做模块执行不能被当做脚本执行