模块篇:模块导入问题、绝对导入和相对导入、软件开发目录规范

2022.3.25学习笔记

  • 循环导入问题
  • 判断文件类型
  • 模块的查找顺序
  • 绝对导入和相对导入
  • 模块与包(简单)
  • 编程思想的演变
  • 软件开发目录规范

一、循环导入问题

两个文件互相导入,可能出现某个名字还没被创建就使用的情况,导致报错,因此在编程中应当尽量避免循环导入的情况。

如果确实需要循环导入,那么要确保双方互相导入使用的名字都提前定义好,也就是在导入之前就已经存在,这是一错再错的方法

方式1:将导入模块的句式写在定义名字的的下面

方式2:将导入模块的句式写在函数体代码里

二、判断文件类型

文件类型有两种:

(1)执行文件

(2)被导入文件

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
这里需要引入一个内置变量__name__ 1.当前文件是执行文件时 print(__name__) # 结果是__main__ 2.当前文件是被导入文件时,被导入文件吗,名为mdddd print(__name__) # 结果是mdddd,文件名

因此在被导入文件可以使用这个方法,设置判断是执行文件才执行的代码,如下:

复制代码
  • 1
  • 2
if __name__ == '__main__': # pycharm中快捷方式:main+tab键 该文件执行才会执行的代码

三、模块的查找顺序

顺序:

内存>>>内置模块>>>sys.path>>>找不到会报错

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
1.先从内存空间查找验证 import m1 import time time.sleep(10) # 睡眠10秒期间把m1文件删除 print(m1.name) # 'jaosn',正常显示,说明已经加载到内存,但是再运行就会报错 2.从内置模块查找 假如文件名与内置模块名字冲突会怎么样?因为会先从内置模块查找,所以不会导入自己写的文件,因此 # 创建py文件时不要与内置或第三方模块名冲突 3.在sys.path查找 什么时sys.path:相当于当前py文件所在的文件路径 import sys print(sys) # 结果是是个列表,存放了很多文件路径,第一个是当前py文件所在的路径

那么如果在上述三个空间都没找到怎么办呢?

方式1:添加被调用文件的绝对路径至sys.path(类似于添加环境变量)

复制代码
  • 1
  • 2
import sys sys.path.append(r'/Users/jiboyuan/PycharmProjects/day18/aaa')

方式2:使用from...import...句式

复制代码
  • 1
  • 2
  • 3
from aaa import mddd # 寻找当前路径下aaa下面的mddd.py文件并导入 from aaa.bbb.ccc import mddd1 # 通过点的方式进入下一层目录

这里呢就涉及到了绝对导入和相对导入了,我们继续往下看

四、绝对导入和相对导入

绝对导入:

永远按照执行文件所在的路径一层层往下查找(无脑查找即可)

复制代码
  • 1
  • 2
from aaa.bbb.ccc import md # 寻找当前路径下aaa的下下层目录中的md.py文件 # 注意:绝对导入只需要在执行文件下一层层查找即可!!!

相对导入:

按照当前模块所在的路径然后使用特殊符号去查找其他模块

复制代码
  • 1
  • 2
  • 3
  • 4
  • 5
from . import a # 一个点表示使用当前路径目录中的文件 .表示当前路径 ..表示上一层路径 ../..表示上上一层路径 # 注意:相对导入只能在被导入文件中使用!!!

因此,如果想一劳永逸,那么就只使用绝对导入即可!

五、包

专业角度解释:

复制代码
  • 1
# 包就是内部含有__init__.py的文件夹

实际角度解释:

复制代码
  • 1
# 包就是多个模块的结合体(内部存放了多个模块文件)

目的是为了方便管理我们创建的不同文件,一般同类型放在一起进行分类管理

在pycharm中甚至直接提供了创建包的选项:python package

复制代码
  • 1
  • 2
  • 3
  • 4
本质还是文件夹里面有一个__init__文件 # 在导入包的时候,索要名字其实是跟包里面的__init__.py要 1.所以如果要直接通过包的名字使用里面的模块,那么需要提前在__init__中提前导入,好处在于可以提前帮你准备好使用的名字。 2.也可以直接忽略__init__的村子啊直接使用绝对导入,from...import...

六、编程思想的演变

1、小白阶段

此阶段写代码就是在一个文件内不停地堆叠代码的行数

2、函数阶段

此阶段写代码学会了将一些既定的功能代码封装起来供后面反复使用,好处是可以重复使用,不考虑顺序

3、模块阶段

此阶段不单单是将功能代码封装成函数,并且将相似的代码功能拆分到不同的py文件中方便后续使用和管理

这种演变方式,是我们由浅入深的过程,也越来越方便、快捷、高效的管理资源

七、软件开发目录规范

实际工作中许多程序软件都是由很多文件夹和文件组成的,并且这些文件夹都是有一定规范和作用的,这些就是软件开发目录规范

1.bin文件夹

存放程序的启动文件,start.py

2、conf文件夹

存放程序的配置文件,settings.py

3、core文件夹

存放程序的核心业务,src.py

是最为重要的核心代码,能够实现具体需求

4、lib文件夹

存放程序公共的功能,commom.py

5、db文件夹

存放程序的数据,userinfo.txt

6、log文件夹

存放程序的日志记录,log.log

7、readme文本文件

存放程序的说明、广告等额外的信息

8、requirements.txt文本文件

存放程序需要使用的第三方模块及对应的版本

注意:目录的名字可以不一致,但是中心思想是一致的,就是为了方便管理,解耦合等

posted @   马氵寿  阅读(127)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开