一, 模块
何为模块?
模块是最高级别的程序组织单元; 在 python 中, 模块一般是 python 或 C 或 Java 等语言编写的扩展文件, 这个扩展文件可以被导入使用.
为何使用模块?
模块首先是一个文件, 这个文件可以在多种环境下任意次数地重新载入和重新运行, 这就是说, 模块可被重用; 其次, 模块作为 python 中最高级别的程序组织单元, 在每一次导入时, 客户端只需导入模块, 就能使用模块定义的变量名以及变量名所引用的对象.
模块的导入前提
1, 导入模块是由 python 自身提供的, 在 python 标准链接库中.
2, 模块导入的两个语句 (import 和 from)
3, 初次导入模块时, 需要先找到要导入的模块文件, 在 sys.path 的路径中
寻找.
4,python 把载入的模块存储到 sys.modules 中, 在每次导入操作开始前检查该字典, 如果不存在, 会执行导入操作, 如果存在, 不执行任何操作.
5, 模块文件的选择: 如要导入的模块在 sys.path 字典的第一个路径和第三个路径中同时出现, 只会导入第一个路径中的模块.
模块导入之 import 语句
import 将整个模块对象赋值给一个变量名
1,import 模块名
- >>> import sys
- >>> print(sys.path)
- ['','C:\\Python37\\python37.zip','C:\\Python37\\DLLs','C:\\Python37\\lib','C:\\Python37','C:\\Python37\\lib\\site-packages']
2,import 模块名 as 别名
- >>> import sys as systemctl
- >>> print(systemctl.path)
- ['','C:\\Python37\\python37.zip','C:\\Python37\\DLLs','C:\\Python37\\lib','C:\\Python37','C:\\Python37\\lib\\site-packages']
3,import 模块 1, 模块 2
>>> import sys,os
模块导入之 from 语句
from 将一个或多个变量名赋值给另一个模块中同名的对象
1,from 模块名 import 变量名
直接使用变量名就可以完成操作
如果本文件中有相同的变量名会发生冲突
- >>> from sys import path
- >>> print(path)
- ['','C:\\Python37\\python37.zip','C:\\Python37\\DLLs','C:\\Python37\\lib','C:\\Python37','C:\\Python37\\lib\\site-packages']
2,from 模块名 import 变量名字 as 别名
- >>> from sys import path as systempath
- >>> print(systempath)
- ['','C:\\Python37\\python37.zip','C:\\Python37\\DLLs','C:\\Python37\\lib','C:\\Python37','C:\\Python37\\lib\\site-packages']
3,from 模块名 import 变量 1, 变量 2
>>> from os import path,kill
4,from 模块名 import *
将模块中的所有变量名都放到内存中
如果本文件中有相同的变量名会发生冲突
>>> from os import path,kill
5,from 模块名 import * 和 all
没有 all 这个变量就会导入所有的变量
如果有 all 变量, 只导入 all 列表中的变量
模块导入流程
1, 先从 sys.modules 里查看是否已经被导入
2, 在 sys.path 的目录中找到模块
3, 创建这个模块的命名空间
4, 把文件中的名字放入命名空间
何为模块命名空间
每一个模块就是一个命名空间, 存在于模块之内的变量名就是模块对象的属性
1, 模块语句会在首次导入时执行
2, 顶层的赋值语句会创建模块属性
3, 模块的命名空间能通过属性 dict 或 dir() 来获取
4, 模块文件的作用域就是模块对象的属性的命名空间, 即每一个模块都是独立的作用域
二, 包
我们知道通过 import 和 from 语句可以导入模块, 用法时直接在语句后跟要导入的模块名, 那么我们如果要导入目录路径呢? 也是可以的, python 代码的目录就称为包, 因此, 这类导入称之为包导入. 包导入是将要导入的目录创建为一个新的命名空间, 目录中的子目录和模块文件就是命名空间的属性.
包的导入
包的导入与模块的导入类似, 只是加上了目录层级
- import dir1.dir2.pic
- from dir1.dir2 import pic
导入包的路径与导入模块一致
就是说 dir1 所在的目录必须在 sys.path 中
init.py 文件
包导入语句的路径中的每个目录内都必须有 init.py 文件, 否则导入包就会失败; 示例中 dir1 和 dir2 的目录下必须有 init.py 文件
包的初始化
导入包时, 会自动执行该目录下 init.py 文件中的所有代码, 因此这个文件是放置导入包时初始化的代码, 比如写入导入其他目录及模块
包的相对路径导入
在上面的导入中, 是从顶层目录向下逐步找到要导入的文件的, 给出的是绝对路径; 包也可以相对路径导入, 类似于 Linux 系统中 "." 与 "..".
from ..import pic
相对导入只适用于包内部导入, 且只适用于 from 语句
init 文件中如使用相对路径导入, 在包的外部导入没问题, 在包内部使用也需使用相对路径
如使用绝对路径导入, 在内部或外部使用都没问题
三, name 变量
在模块中有个变量 name
当我们直接执行这个模块的时候, name=='main'
当我们执行其他模块, 在其他模块中引用这个模块的时候, 这个模块中的 name=='模块的名字'
来源: http://www.bubuko.com/infodetail-2914093.html