模块:
模块就是一系列功能的结合体。
模块有三种:
1.内置的(python解释器自带的一些模块)
2.第三方的需要下载
3.自定义的一些python文件
模块的四种表现形式:
1.用python编写的.py文件
2.使用以及编辑好的共享库或DLL的C或C++扩展
3.使用一系列py文件的结合体(内置有__init__方法的文件夹)称之为包
4.使用c编写链接到python解释器的内置模块
多次导入模块不会执行模块,会沿用第一次导入的成果
运行执行文件会首先产生这个py文件的名称空间
然后再会导入模块
import.....导入模块的三件事:
1.将被导入的模块编译成对应py文件并执行
2.将运行产生的名字放入这个被导入模块的名称空间里
3.执行文件的名称空间直接拿到指向被导入模块的名称空间里的名字
如果模块名字太长的话还可以给模块起别名比如import sosiwsjskskk as e,然后只要e.就可以
然后再模块名.就可以访问模块内的名字
并且不与执行文件中的名字冲突,就算被导入文件里面的名字与执行文件的名字一样也没有事情,因为我是模块名字点获取,指名道姓不会有冲突。
from .... import.....导入模块的三件事:
1.将导入的模块编译成相应的py文件并执行
2.将执行过程中产生的名字放入这个导入的模块的名称空间里面
3.执行文件的名称空间拿到指向导入模块的名称空间的某个值的名字
与import就第三点不同其他一样。
特点:访问模块中的名字就不用加模块名前缀
缺点:这样会与执行文件里面的名字冲突,相同那前面一个就会被后面赋值给顶掉
补充:
from 模块名 import * 这个直接会拿到这个模块里面的所有名字(不建议)因为如果你用第三方模块你不知道他里面有多少名字,你又只想用这个模块里面的几个,极度占用内存,并且你也不知道有哪些名字是可以用的
里面有__all__这个里面添加的就是给执行文件导入这个模块后可以访问到的名字用来限制的。
模块的查找顺序:
1.先找内存
2.再找内置
3.最后找sys.path(环境变量里面的)
最后找不到就报错
sys.path(环境变量)是一个大列表里面放着一堆文件路径,注意:第一个路径始终是当前执行文件所在文件夹。
循环导入:
问题点:名字没有产生就使用了名字
解决:先产生名字再导入模块
也就是将会产生循环导入的模块,导入语法延后------延后导入
绝对导入和相对导入:
绝对导入:必须依据被执行文件所在文件夹为准。
绝对导入无论在执行文件中还是被导入文件中都适用
相对导入:只能在被导入模块内使用也就是说不能在执行文件中导入
里面的.代表当前路径
..代表上一级路径
...代表上上一级路径
也就是说相对导入不需要知道谁是执行文件,只需要知道模块与模块之间的路径
然后__name__这个也就是当文件被当作执行文件的时候其打印是__main__,如果被当作导入模块时打印出来的就是模块名
所以可以加判断,if __name__ == '__main__'如果这个成立那么这个文件才当作执行文件去执行
软件目录规范
项目跟目录:
bin:
里面有start.py项目启动文件
conf:
里面settings.py项目配置文件信息,一些不经常改变的变量名与值的对应的关系
core:
里面src.py项目核心逻辑文件
db
里面是项目文件的数据库
lib
里面common.py放着一些项目需要的公共方法
log
里面是项目日志文件,记录用户操作的
readme
项目的一些功能介绍
然后start这个启动可以不用放在bin文件夹下,可以直接放在根目录下。
区别:
放在bin目录下,我如果要将其加到环境变量中将要2步
import os
import sys
path = os.path.dirname(os.path.dirname(__file__)) #往上找2层
sys.path.append(path)
如果提出来就是
import os
import sys
path = os.path.dirname(__file__)
sys.path.append(path)
就少一步os.path.dirname()没什么大区别