1、模块的使用
1、模块的分类
2、模块的使用
3、模块的搜索路径和优先级
4、软件开发目录规范
一、模块的介绍分类
1、什么是模块
#模块就是一系列功能的集合体
模块大致分为四类:
1、一个py文件就是一个模块,文件名叫text.py的文件,模块名就叫text
2、一个包含有__Int__.py文件的文件夹称之为包,包也是模块
了解:
3、使用 C 编写并连接到python解释器的内置模块
4、已被编译为共享库或 DLL 的 C 或 C++ 扩展
#模块的来源:
1、自带的模块
2、第三方模块:pip3 install requests
3、自定义的模块
2、为什么要用模块
1、自定义的模块和第三方模块 -->提升工作效率,拿来就用
2、自定义模块,解决代码冗余
二、模块的使用
模块是被用来导入的 而不是用来直接运行的
1、首次导入模块发生是事情
1、运行导入的 模块,创建一个 模块 的名称空间,将 模块 运行过程中产生的名字都丢到模块的名称空间中
2、在当前名称空间中得到一个名字,改名字是指向模块的名称空间
ps:后续的再重复导入模块直接引用首次导入,不会重复执行模块,不会重复的创建名称空间
示例
#文件名:foo.py
x=1
def get():
print(x)
def change():
global x
x=0
class Foo:
def func(self):
print('from the func')
引用foo文件
import foo #导入模块foo
a=foo.x #引用模块foo中变量x的值赋值给当前名称空间中的名字a
foo.get() #调用模块foo的get函数
foo.change() #调用模块foo中的change函数
obj=foo.Foo() #使用模块foo的类Foo来实例化,进一步可以执行obj.func()
ps:加上foo.作为前缀就相当于指名道姓地说明要引用foo名称空间中的名字,所以肯定不会与当前执行文件所在名称空间中的名字相冲突,
并且若当前执行文件的名称空间中存在x,执行foo.get()或foo.change()操作的都是源文件中的全局变量x
2、模块导入的规范
通常情况下所有的导入语句都应该写在文件的开头,然后分为三部分:
第一部分:先导入python自带的模块
第二部分:导入第三方
第三部分:导入自定义模块
import os,sys 不建议,建议分开写
import os
import sys
3、from-import 语句
from...import...与import语句基本一致,唯一不同的是:使用import foo导入模块后,引用模块中的名字都需要加上foo.作为前缀,
而使用from foo import x,get,change,Foo则可以在当前执行文件中直接引用模块foo中的名字,如下:
from foo import x,get,change #将模块foo中的x和get导入到当前名称空间
a=x #直接使用模块foo中的x赋值给a
get() #直接执行foo中的get函数
change() #即便是当前有重名的x,修改的仍然是源文件中的x
无需加前缀的好处是使得我们的代码更加简洁,坏处则是容易与当前名称空间中的名字冲突,如果当前名称空间存在相同的名字,则后定义的名字会覆盖之前定义的名字。
另外from语句支持from foo import 语法,代表将foo中所有的名字都导入到当前位置
from foo import * #把foo中所有的名字都导入到当前执行文件的名称空间中,在当前位置直接可以使用这些名字
# 但是不建议使用
a=x
get()
change()
obj=Foo()
三、模块的搜索路径和优先级
在导入一个模块时,如果该模块已加载到内存中,则直接引用,否则会优先查找内置模块,
然后按照从左到右的顺序依次检索sys.path中定义的路径,直到找模块对应的文件为止,否则抛出异常。sys.path也被称为模块的搜索路径,它是一个列表类型
>> sys.path
['',
'/Library/Frameworks/Python.framework/Versions/3.5/lib/python35.zip',
'/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5',
...,
'/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages'
列表中的每个元素其实都可以当作一个目录来看:在列表中会发现有.zip或.egg结尾的文件,二者是不同形式的压缩文件,
事实上Python确实支持从一个压缩文件中导入模块,我们也只需要把它们都当成目录去看即可。
sys.path中的第一个路径通常为空,代表执行文件所在的路径,所以在被导入模块与执行文件在同一目录下时肯定是可以正常导入的,
而针对被导入的模块与执行文件在不同路径下的情况,为了确保模块对应的源文件仍可以被找到,需要将源文件foo.py所在的路径添加到sys.path中,
假设foo.py所在的路径为/pythoner/projects/
import sys
sys.path.append(r'/pythoner/projects/') #也可以使用sys.path.insert(……)
import foo #无论foo.py在何处,我们都可以导入它了
四、软件开发规范目录
core/: 存放业务逻辑相关代码
api/: 存放接口文件,接口主要用于为业务逻辑提供数据操作。
db/: 存放操作数据库相关文件,主要用于与数据库交互
lib/: 存放程序中常用的自定义模块
conf/: 存放配置文件
run.py: 程序的启动文件,一般放在项目的根目录下,因为在运行时会默认将运行文件所在的文件夹作为sys.path的第一个路径,这样就省去了处理环境变量的步骤
setup.py: 安装、部署、打包的脚本。
requirements.txt: 存放软件依赖的外部Python包列表。
README: 项目说明文件。