九、模块与包
http://www.cnblogs.com/Eva-J/articles/7292109.html#_label7
1、模块
1.1 什么是模块
常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
但其实import加载的模块分为四个通用类别:
1 使用python编写的代码(.py文件)
2 已被编译为共享库或DLL的C或C++扩展
3 包好一组模块的包
4 使用C编写并链接到python解释器的内置模块
1.2 为何要使用模块
如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。
随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用
1.3 模块导入规则
python建议一行只导入一个模块 多个模块分多行导入
1.4 模块导入顺序
先导入内置的,再导入第三方的,再导入自己写的
1.5 模块的命名空间
模块有自己的命名空间
1.6 import的用法
#导入模块干了哪些事:
#1 执行源文件
#2 以一个源文件的全局名称空间
#3 在当前位置拿到一个模块名,指向2创建的名称空间
1.7 as起别名
1.8 from...import
#优点:使用源文件内的名字时无需加前缀,使用方便
#缺点:容易与当前文件的名称空间内的名字混淆
1.8.1 from...import
1.8.2 from 模块名 import 名字 as 重命名
如果你导入的模块过大,而你要用的功能很少‘‘
1.8.3 from 模块名 import *
__all__和*配合,__all__只能约束*,import *时列表里面加功能名
__all__=[] 列表里面加字符串
有文件用from my_module import *导入模块时,只能导入__all__列表里面的方法
1.9 模块的搜索路径
1.9.1 sys.modules
可以通过sys.modules找的内存中已经加载了哪些写模块
1.9.2模块的查找顺序
模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块
python程序的修改必须重新加载才能生效,自定义的模块名一定不要与python自带的模块名重名
1.9.3 sys.path
#注意:自定义的模块名一定不要与python自带的模块名重名
#内存中--》内置模块————》sys.path
sys.path第一个值是执行文件的当前目录
添加模块路径到环境变量
import sys
#print(sys.path)
sys.path.insert(0,r‘C:\Users\Administrator\PycharmProjects\python18期周末班\day5\模块\模块的搜索路径\aaa‘)
print(sys.path)
1.10、__name__、__main__
区分python文件的两种用途
用途一:当作脚本文件使用
用途二:当作模块使用
__name__:文件当作脚本运行时__name__等于__main__,文件当作模块被加载运行时__name__等于模块名
所以在写模块脚本时可以加判断条件 if __name__ == ‘__main__‘:,这样就可以区分python模块与脚本的用法,写模块时应该这样写。
1.11 relod()
import importlib
importlib.reload() 如果在导入模块后执行某个方法前修改了模块中的这个方法,用reload()这个方法可以立即导入修改的方法不需要重新导入模块,只能用于测试环境
2、包
2.1 注意
1、无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法
2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)
3. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件
强调:
1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错
2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包即模块,包是文件的集合
2.2 __init.py__
用执行文件执行__init.py__中导入的包时,路径以执行文件为准,所以要有from...import形式导入,执行文件导入包是实际执行包下面的__init__.py文件。
2.3 绝对导入和相对导入
当包内的文件要导入包内其他文件的时候,即如果包的模块之间存在引用关系:
绝对路径的导入 :导入的路径会随着包与文件之间关系的变化而变化在包内部、外部都可以执行
相对路径的导入 :一次写好的模块的导入关系,不需要关心模块和文件之间的关系只能在包的外面执行
2.3.1 绝对导入
2.3.2 相对导入
3、项目开发规范
3.1 bin
bin目录中固定有一个start.py文件作为启动文件
所有的代码以start.py为出发点 start.py调core里的core.py文件
start.py开头固定写
import os
import sys
BaseDir = os.path.dirname(os.path.dirname(os.getcwd()))
sys.path.append(BaseDir)
from ChoiceCourses.core import core
core.main()
os.getcwd()取当前文件路径
os.path.dirname 取目录
3.2 conf
放配置文件
3.3 core
放核心文件,目录中要有一个core.py文件存放输入输出之类的代码或者字典
在文件内调用其他模块用绝对路径
包用相对路径 因为包是在外部调
项目用绝对路径 因为项目在自己内部调
3.4 db
存放所有数据
3.5 lib
存放别人写的模块,不需要pip安装可以直接用的模块,非自己写的模块
3.6 log
存放日志文件