python模块微讲解(二)
python模块微讲解(二)
1.循环导入问题
循环导入就是你导入我、我导入你,互相调用,循环导入很容易出现某个名字还没有被创建就被使用而报错,所以在我们做项目的时候就要尽量避免循环导入问题,如果避免不了,那就要确保使用的名字提前定义好,有两种方式:
(1).将导入模块的名字写在定义名字的下面。
(2).将导入模块的名字写到函数体代码中。
2.判断文件类型
pycharm中的py文件分为两种类型:
(1).执行文件
(2).被导入文件
有一个内置方法"__name__"可以来区别,当"__name__"方法在执行文件中,输出的是"__main__":
当"__name__"方法在被导入文件中,输出的是被导入的文件名:
我们在自定义模块的时候,模块中可能会写很多的功能,我们肯定需要自己测试一下,会产生很多的测试代码,我们可以使用"__name__"来进行区分:
3.模块查找顺序
(1).先从内存空间中查找
我们可以验证一下,先写一个执行文件,再写一个被导入文件,在执行文件中导入被导入文件,并导入"time"模块,让程序睡眠15s的时间,然后删除被导入文件,发现依然可以打印,再次执行就会报错,因为已经没有了刚刚的被导入文件,内存中也已经清除:
import modular26 import time time.sleep(15) modular26.index()
(2).在内置模块中查找
比如我们上述刚刚用到的time模块,就是内置模块。
这里我们要强调一下:我们在定义py文件名的时候,尽量不要与模块名一样,这里的模块名是内置模块和第三方模块。
(3).在sys.path内查找
当在内存空间和内置模块找不到的时候,就回去"sys.path"中查找,我们来看看"sys.path"输出的啥
import sys # ['F:\\Py3\\day1', 'F:\\Py3\\day1', # 'F:\\pycharm\\PyCharm 2020.3.5\\plugins\\python\\helpers\\pycharm_display', # 'F:\\Python36\\python36.zip', 'F:\\Python36\\DLLs', # ......] print(sys.path)
发现是一个列表,里面是很多的路径,也就是说在内存空间和内置模块找不到的时候,就会查看文件的路径,看看有没有我们想要的。
虽然输出了很多路径,但是我们重点看的就是第一个,第一个其实就是执行文件所在的路径,我们寻找模块的时候只需要站在执行文件的路径查看即可。
那如果两个文件不在同一目录下,怎么解决呢?来看:
方式一:直接添加"sys.path"路径:
import sys sys.path.append(r'F:\\Py3\\day1\\sss') import asd print(asd.name)
方式二:使用"from + ... + import + ..."句式直接指名道姓的添加:
from sss import asd print(asd.name)
如果文件有多个目录,可以通过加点的方式进入下一层:
from sss.aaa.ddd import asd print(asd.name)
4.绝对导入与相当导入
再导入模块的时候,一切查找模块的语句都是以执行文件为准,无论导入的句式是在执行文件还是在被导入文件。
(1).绝对导入:
按照文件的目录一层一层的往下寻找。
(2).相对导入:
相对导入打破了必须参照执行文件的所在路径的这一特性,只需要考虑当前模块所在的位置,然后使用特殊符号去查找。
''' . 表示当前路径 .. 表示上一层路径 ../.. 表示上上一层路径 '''
5.包
包就是多个模块的结合体,也就是说内部存放了多个模块,但是呢包有一个共同的特点,那就是内部都含有"__init__.py"的文件。
为什么要有这个文件的,那是因为在我们导入包的时候,调用名字的时候,其实是在调用"__init__.py"里面的名字,所以呢就有两种方法:
(1).如果想直接通过包的名字使用包里面的所有模块,那么需要在"__init__.py"中提前导入。
(2).如果嫌弃上述方法麻烦,也可以使用绝对导入
6.软件开发目录规范
(1).bin文件夹:
存放程序的启动文件
(2).conf文件夹:
存放程序的配置文件
(3).core文件夹:
存放程序的核心业务,也就是最为重要的代码
(4).lib文件夹:
存放程序公共的功能
(5).DB文件夹:
存放程序的数据
(6).log文件夹:
存放程序的日志记录
(7).readme文件夹:
存放程序的说明等其他的额外信息
(8).requirements.txt文本文件:
存放程序需要使用的第三方模块及对应的版本
这里是IT小白陆禄绯,欢迎各位大佬的指点!!!