1、模块:
模块的定义 模块就是一个py文件 调用一个模块的时候会自动运行这个模块 注意: 一个模块不会被导入多次 不要在同一行 导入多个模块 导入顺序 内置模块---第三方模块---自定义模块 模块的 命名空间 --- 有单独的命名空间 导入模块的时候 会创建一个模块的命名空间 把里面的名字都绑定到自己的命名空间 重命名 可以 import my_module as mm 给模块重命名 json -- pickle 操作都一样--可以把名字 mysql---oracle ---sql 只导入指定的方法 from .. import ..as .. 只导入指定的方法 多个导入 from my_module import (read1 as read, read2 as read2, money as m) from... import * ---- 不用加模块名 模块中的名字不要和文件里的冲突 print(dir()) # 查看自己导入的模块 import math ---- from math import pi (节省)---- from math import math 模块里面 导入的模块 可以被使用 --- 一次导入 后便倒入的模块中也可以 使用这个模块 * -- __all__=[] 约束 * import sys ---- print(sys.modules) --当前引入的所有模块 模块第一次导入的时候 已经放在内存里 第一次导入 import my_module 时 生成 pyc 编译文件 字节码 第一次导入的时候 耗时间 python -m my_module.py 强行生成pyc sys.path---找模块路径---丛路径找模块 sys.modules --当前引入的所有模块 __name__ --- __main__ 只在自己作为脚本的时候执行 用做脚本测试时 if __name__==‘__main__‘ def login(): print(‘ads‘) if __name__==‘__main__‘: login() dir(模块) --- 把模块的名字全部显示出来
2、包:
模块的定义 模块就是一个py文件 调用一个模块的时候会自动运行这个模块 注意: 一个模块不会被导入多次 不要在同一行 导入多个模块 导入顺序 内置模块---第三方模块---自定义模块 模块的 命名空间 --- 有单独的命名空间 导入模块的时候 会创建一个模块的命名空间 把里面的名字都绑定到自己的命名空间 重命名 可以 import my_module as mm 给模块重命名 json -- pickle 操作都一样--可以把名字 mysql---oracle ---sql 只导入指定的方法 from .. import ..as .. 只导入指定的方法 多个导入 from my_module import (read1 as read, read2 as read2, money as m) from... import * ---- 不用加模块名 模块中的名字不要和文件里的冲突 print(dir()) # 查看自己导入的模块 import math ---- from math import pi (节省)---- from math import math 模块里面 导入的模块 可以被使用 --- 一次导入 后便倒入的模块中也可以 使用这个模块 * -- __all__=[] 约束 * import sys ---- print(sys.modules) --当前引入的所有模块 模块第一次导入的时候 已经放在内存里 第一次导入 import my_module 时 生成 pyc 编译文件 字节码 第一次导入的时候 耗时间 python -m my_module.py 强行生成pyc sys.path---找模块路径---丛路径找模块 sys.modules --当前引入的所有模块 __name__ --- __main__ 只在自己作为脚本的时候执行 用做脚本测试时 if __name__==‘__main__‘ def login(): print(‘ads‘) if __name__==‘__main__‘: login() dir(模块) --- 把模块的名字全部显示出来
包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。
比如一个模块的名称是 A.B, 那么他表示一个包 A中的子模块 B 。
就好像使用模块的时候,你不用担心不同模块之间的全局变量相互影响一样,采用点模块名称这种形式也不用担心不同库之间的模块重名的情况。
这样不同的作者都可以提供 NumPy 模块,或者是 Python 图形库。
不妨假设你想设计一套统一处理声音文件和数据的模块(或者称之为一个"包")。
现存很多种不同的音频文件格式(基本上都是通过后缀名区分的,例如: .wav,:file:.aiff,:file:.au,),所以你需要有一组不断增加的模块,用来在不同的格式之间转换。
并且针对这些音频数据,还有很多不同的操作(比如混音,添加回声,增加均衡器功能,创建人造立体声效果),所你还需要一组怎么也写不完的模块来处理这些操作。
这里给出了一种可能的包结构(在分层的文件系统中):
sound/ 顶层包 __init__.py 初始化 sound 包 formats/ 文件格式转换子包 __init__.py wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py ... effects/ 声音效果子包 __init__.py echo.py surround.py reverse.py ... filters/ filters 子包 __init__.py equalizer.py vocoder.py karaoke.py ...
从一个包中导入*
设想一下,如果我们使用 from sound.effects import *会发生什么?
Python 会进入文件系统,找到这个包里面所有的子模块,一个一个的把它们都导入进来。
但是很不幸,这个方法在 Windows平台上工作的就不是非常好,因为Windows是一个大小写不区分的系统。
在这类平台上,没有人敢担保一个叫做 ECHO.py 的文件导入为模块 echo 还是 Echo 甚至 ECHO。
(例如,Windows 95就很讨厌的把每一个文件的首字母大写显示)而且 DOS 的 8+3 命名规则对长模块名称的处理会把问题搞得更纠结。
为了解决这个问题,只能烦劳包作者提供一个精确的包的索引了。
导入语句遵循如下规则:如果包定义文件 __init__.py 存在一个叫做 __all__ 的列表变量,那么在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入。
作为包的作者,可别忘了在更新包之后保证 __all__ 也更新了啊。你说我就不这么做,我就不使用导入*这种用法,好吧,没问题,谁让你是老板呢。这里有一个例子,在:file:sounds/effects/__init__.py中包含如下代码:
__all__ = ["echo", "surround", "reverse"]
这表示当你使用from sound.effects import *这种用法时,你只会导入包里面这三个子模块。
如果 __all__ 真的没有定义,那么使用from sound.effects import *这种语法的时候,就不会导入包 sound.effects 里的任何子模块。他只是把包sound.effects和它里面定义的所有内容导入进来(可能运行__init__.py里定义的初始化代码)。
这会把 __init__.py 里面定义的所有名字导入进来。并且他不会破坏掉我们在这句话之前导入的所有明确指定的模块。看下这部分代码:
import sound.effects.echo import sound.effects.surround from sound.effects import *