研究模块一定要清楚谁是执行文件,谁是被导入模块,sys.path是以执行文件为准的
(导入模块间相互调用,也是参考执行文件的sys,path)
模块
一. 什么是模块
模块就是一系列功能的集合体
模块分为四个通用的类别:
1 使用python编写的.py文件(*****)
2 已被编译为共享库或DLL的C或C++扩展
3 包(*****)
4 使用C编写并链接到python解释器的内置模块
模块有三种来源:
1. 内置模块
2. 第三方模块
3. 自定义模块
二. 为何要用模块
1. 使用内置的或者第三方的模块的好处是:拿来主义,极大提升开发效率
2. 使用自定义的模块的好处是:将共用功能代码放入模块中,好处是可以减少代码冗余
三. 如何用模块
1.命名:与变量命名方式相同(注意不能把常用模块名命名成模块名)
2.首次导入模块会发生三件事
1. 会产生一个 '导入模块' 的名称空间
2. 执行 '导入模块’ 中文件的内容,将产生的名字丢到‘导入模块’的名称空间里
3. 执行时,在当前 ‘执行文件’ 中拿到一个名字(模块名),该名字指向 ‘导入模块’ 名称空间 (import导入)
3. 在当前执行文件中拿到名字read1,该名字指向模块的名称空间中的read1 (from spam import read1)
3.查找模块路径的优先级
1. 内存
2. 内置模块
3. sys.path(是以执行文件为准的,执行文件所在的文件夹)
4. 补充:
import spam as sm 模块较长时,可以使用as赋值其他名字
print(sm.money)
可以在一行导入多个模块,建议一行导入一个
import os,sys,spam
区分python文件的两种用途
if __name__ == __main__
5.import总结
优点:指名道姓地问某一个名称空间要名字,不会与当前执行文件名称空间中的名字冲突
缺点:引用模块中的名字必须加前缀(模块名.),使用不够简洁
6.from...import总结
优点:引用模块中的名字不用加前缀(模块名.),使用更为简洁
缺点:容易与当前执行文件名称空间中的名字冲突
#导入模块spam, age = 18 #执行模块run age = 20 from spam import age print(age) >>>>18 ___________________________________________________ from spam import age age = 20 print(age) >>>>20
小练习,在引用模块里,分别改变函数了的可变/不可变的数据,改变前后执行模块里的值是否改变
不可变
引用模块spam age = 18 def func(): global age age = 20 def func1(): func1测试spam中age是否改变 print(age) 执行模块run from spam import age,func,func1 print(age) func() print(age) func1() >>>>18 >>>>18 >>>>20
可变
引入模块spam l=[] def func(): l.append(1231) def func1(): print(l) 执行模块run from spam import l,func,func1 print(l) func() print(l) func1() >>>>[] >>>>[1231] >>>>[1231]
*与__all__
软件开发目录规范
1.应该把项目的根目录加到环境变量里
2.应该把项目根目录所在的绝对路径拿到,然后添加到环境变量里
import os print(os.path.abspath(__file__)) 当前执行路径 ————————————————————————————— import os print(os.path.dirname(os.path.abspath(__file__))) 当前路径上一级路径 os.path.dirname 找当前路径上一级路径 _____________________________________________________ 把环境变量写活,避免安装路径不同 import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) import sys sys.path.append(BASE_DIR) from core import scr scr.run()
bin(启动文件)
conf(配置文件)
core(核心业务逻辑)
src.py
db(数据)
lib(自定义模块)
log(日志)
readme文本文件
包
一、什么是包
包就是包含有__init__.py文件的文件夹、
注意:在py2中必须有一个__init__.py文件,而py3中即便没有也不会报错
二、
首次导入包,发送三件事,
1. 以包下的__init_.py文件为基准来产生一个名称空间
2. 执行包下的__init_.py文件的代码,将执行过程中产生的名字都丢到名称空间中
3. 在当前执行文件中拿到一个名字p1,该p1就是指向__init__.py名称空间的
总结包的使用无非注意三点:
1. 但凡是在导入语句中带点的,点的左边都必须是一个包
2. 导入包就是在导包下的__init__.py文件
3. 如果使用绝对导入,绝对导入的起始位置都是以包的顶级目录为起始点
4. 但是包内部模块的导入通常应该使用相对导入,用.代表当前所在的文件(而非执行文件),..代表上一级
强调:
1. 相对导入只能包内部的模块之间互相导入使用
2. ..上一级不能超出顶级包