模块的搜索路径: 1. 首先从 sys.path中寻找, 2. 从 环境变量 PYTHONPATH中寻找.
模块导入: 会导入模块的所有对象,包括变量, 函数,数据类型和子模块, 除了以下划线引导的对象(私有对象)
import importable
import importable1, importable1, importable2...
import importable as preferred_name #重命名, 好用在两个模块A/B拥有同样API时, 先 Import A as m, 用完之后 再用 import B as m , 这样就可以还是使用m, 但是利用是 B 内的API.
导入部分的写法
from importable import object as preferred_name
from importable import object_1, obj2, obj3,...
from importable import (obj1, obj2,....)
from importable import * #* 代表引入非私有的一切对象, 如果模块中存在 __all__变量, name导入的应该是名称包含在__all__变量中的所有对象.
python的模块导入, 是以字节码(编译后的形式)把模块加载到内存中的.
1. 首先找同名的 .pyo 结尾的文件(最优化的字节码编译版本), 如果不存在或者pyo比py旧,在进行步骤2
2. 找同名的 .pyo 结尾的文件(非最优化的字节码编译版本), 如果不存在或者pyc比py旧,在进行步骤3
3. 找到 py 文件, 并将它编译为字节码版本, 然后加载.
pyo 文件是由 python -O xxx.py 或者 指定了 PYTHONOPTIMIZE环境变量设置为O时产生(即抛弃断言assert的版本). 而 pyc 是默认产生的字节码文件.
----------------------------------------------------------------------------------------------------------------------
自定义模组
1. 使用 python -c "import music" 查看music模组是否存在.
2. 自定模组尽量第一个字母大写, 以便避免名字冲突. (因为所有标准库的模块都是小写命名的)
----------------------------------------------------------------------------------------------------------------------
包: 目录, 包含一组模块和一个 __init__.py 文件.
引入包:
import 目录名.模块名 as xxx # as 可选, 没有as 时访问应当使用 目录名.模块名 全称
from 目录名 import 模块名 as xxx # as 可选, 可以直接使用模块名或者 xxx
制作包:
1. 建立子目录, 加入所有的模块.py 和一个 空的 __init__.py 文件, 就是最简单的一个包.
2. 在 __init__.py 中加入 __all__ = ["模块名", "模块名", ...] , 然后在其他py文件中就可以直接使用 from 目录名 import * . 因为 * 表示导入在__all__列表的所有模块名, 并且可以直接进行模块名的使用.
注意: from 模块名 import * 为模块中所有的对象.(包括函数,变量)都被导入, 除私有对象(_打头的变量或者函数), 当然模块中也可以存在一个 __all__列表, 代表可以导出的内容.
----------------------------------------------------------------------------------------------------------------------
自定义模块的docstring.
docstring: 形式一般为第一行为概括描述, 第二空行, 第三行描述和实例. 其中实例部分要求 >>> 命令行输入 然后下一行为命令行的输出.
1. py文件一般第一行shebang, 第二行为注释 #版权或者许可(CopyRight(c) 2018. NF Ltd. All rights reserved.) 第三行为 ''' ''' 包括的docstring, 包括模块的内容概括以及使用示例.
在文件末尾加入
if __name__ == "__main__":
import doctest
doctest.testmod() 则执行docstring的实例. 即python3 -v my.py. 尝试运行docstring中的所有发现的代码段.
2. py内部的函数 def 行后也应该有 docstring,
----------------------------------------------------------------------------------------------------------------------
自定义模块的分发:
1. 把文件放在python的site-packages子目录中.
2. 或者单独建立目录, 在PYTHONPATH环境变量中包括此目录.
3. 把文件放在本地site-packages目录中, 例如 %APPDATA%/Python/Python3.5/site-packages 或者 ~/.local/lib/python3.5/site-packages/
----------------------------------------------------------------------------------------------------------------------
任何模块被导入后, 每个模块拥有一个__name__变量, 此变量为模块名, 但当py文件被运行而不是被导入时, __name__变量为 __main__
----------------------------------------------------------------------------------------------------------------------
阅读(1050) | 评论(0) | 转发(0) |