目 录
一、模块简介
二、模块的导入方法
三、模块的导入的几种方式
循环导入
模块的查找顺序
相对导入和绝对导入
四、Python文件的两种用途
引出__name__用法
五、软件开发目录规范
一、模块基础简介
什么是模块?
模块:就是一系列功能的结合体。
模块的三种来源:1、python解释器内置的 2、第三方模块(别人写的) 3、自定义模块(自己写的模块)
模块的四种表现形式:
1、用python编写的.py文件(一个py文件就是一个模块)
2、由多个py文件组合在一起的文件夹(注意:文件夹中有__init__.py文件的话,该文件夹叫做“包”)
包:一系列py文件的结合体。
3、用C语言编写并连接到python解释器中内置的模块。
4、已编译为共享库或DLL的C或C++扩展(了解)
为什么要用模块?
1、可以调用其他人写的模块来完成某项功能,可以提高开发效率;
2、自己写的项目有的功能可能需要多个py文件来存储,当其他文件都需要某个方法时可以将它写入一个py文件,
其他文件以模块的形式调用它。
如何用模块?
(******)使用模块时,一定要分清哪个是执行文件,哪个是被导入文件。
二、模块的导入方法
import 方法
在执行文件中以import + 模块名方式导入模块,会发生以下几件事:
1、首先在执行文件run.py内生成一个run.py的名称空间:
首次导入模块(md.py)******
a. 执行md.py 文件,生成md.py的名称空间
b. 运行md.py 中的代码并将产生的名字丢入md.py的名字空间
c. 在执行文件中会产生一个指向md.py名称空间的名字md
2、多次导入时不会执行md.py 文件,会沿用第一次导入的结果 ******
调用模块中名字的取值方法:
# 访问模块中的名字指向的值 # print(md.money) # 使用import导入模块 访问模块名称空间中的名字统一句势:模块名.名字
关于import导入模块的方法总结如下:
使用import导入模块 访问模块名称空间中的名字统一句势:模块名.名字 1.指名道姓的访问模块中的名字 永远不会与执行文件中的名字冲突 2.你如果想访问模块中名字 必须用模块名.名字的方式 """ """ 只要当几个模块有相同部分或者属于用一个模块,可以使用上面的方法 当几个模块没有联系的情况下 应该分多次导入 import os import time import md ps:通常导入模块的句式会写在文件的开头 """ """ 当模块名字比较复杂的情况下 可以给该模块名取别名 """
调用被导入模块内的函数时,需要注意:
1.只要你能拿到函数名 无论在哪都可以通过函数加括号来调用这个函数(会回到函数定义阶段 依次执行代码)
2.函数在定义阶段 名字查找就已经固定死了 不会因为调用位置的变化而改变
from ... import ... 方法
执行文件 run1.py 导入文件md1.py
以from...import...方法导入模块时,会发生以下几件事:
1、首先在执行文件run1.py 内生成一个run1.py的名称空间:
首次导入md1.py文件:
a. 执行md1.py文件,生成md1.py的名称空间
b. 运行md1.py内的代码并将产生的变量名字或函数名字丢进md1.py的名称空间
c. 直接拿到md1.py 名称空间中某个值的名字,也就是from...import...后面的名字
2、多次导入该模块不会多次执行,会沿用第一次导入的结果。
from...import...方法导入模块总结如下:
from...import...使用模块中的名字,直接写名字就可以访问 可能会与当前执行文件中的名字冲突 x = 1 from md import x print(x) 模块md中的x from md import x x = 1000 print(x) 当前文件中的x
补充知识点:
知识点补充 from md import * 不推荐使用 消耗资源过多 __all__ = ['','',''] 当__all__所在的文件被当做模块导入的时候 ___all__列表写什么 执行导入语句那个文件就能拿到什么 __all__不写的情况下 默认是将所在文件所有的名字都暴露给导入者 __name__当__name__所在的文件被当做执行文件执行的时候__name__的值就等于__main__ 当__name__所在的文件被当做模块导入的时候__name__的值就等于模块名(py的文件名 不加后缀) if __name__ == '__main__': 启动代码/测试代码 pycharm中可以写main+tab自动补全上面的格式
三、模块的导入的几种方式
循环导入:就是你导入了我,我导入了你
出现循环导入首先要想到的是程序设计不合理,要避免循环导入的出现。
解决循环导入的方法:
1.解决循环导入方式1 将循环导入的语句放在要导入的名字的语句下方 2.解决循环导入方式2 将导入语句写到函数体代码内(利用函数在定义阶段只检测语法不执行代码) 3.解决循环导入方式3(******) 将循环导入的名字 放到另外一个文件中
模块的查找顺序:
模块的查找顺序 1.先在内存中找 2.内置 3.system path(程序的环境变量) 查找模块的路径以执行文件所在的文件夹为准 demo -dir --md.py -run.py 第一种导入:基于当前执行文件所在文件夹路径依次往下找 第二种导入:直接将你需要导入的那个模块所在的文件夹路径添加到system path中
相对导入和绝对导入
绝对导入与相对导入
绝对导入写的就是全路径 该全路径以执行文件所在的文件夹路径为基准
相对导入
.代表当前路径
..代表上一级路径
...代表上上一级路径
注意相对导入只能在模块文件中使用,执行文件中不能使用相对导入
一般情况下项目只会有一个执行文件,项目的其他文件其实都是模块
所以相对导入的应用场景也是很广泛
四、Python文件的两种用途
Python文件主要有两种用途:
1、脚本,一个文件就是整个程序,用来被执行。
2、模块,很多功能的集合体,用来被调用。
当我们写完一个文件的时候肯定会进行功能测试,但是调用该文件的时候又不希望测试的操作被运行,怎么办?
那么如何区分当前是执行文件还是被导入文件?
1、当文件被当做执行文件的时候打印__name__ 结果是__main__
2、当文件被当做模块导入的时候,在执行文件中打印__name__ 结果是__main__
所以为了文件中的测试操作不被执行,我们可以在文件中执行如下操作:
if __name__ == '__main__': # 快捷操作 main+tab键 index1() index2()
五、软件开发目录规范
设置软件开发目录规范的目的:
使项目结构清晰
便于管理
方便扩展
目录规范:
项目名 -bin --start.py 项目的启动文件(start.py也可以直接放在项目根目录下) import os import sys 将项目名所在的路径添加到system path中,如果你是pycharm打开 pycharm会自动将顶级目录路径添加到system path中 而一旦你的项目不是用pycharm打开,亦或者是被用户下载到他自己的机器上,你就必须在项目启动之前将路径设置好 BASE_DIR = os.path.dirname(os.path.dirname(__file__)) sys.path.append(BASE_DIR) from core import src if __name__ == '__main__': src.run() -conf --settings 项目的配置文件 -core --src.py 项目的核心逻辑文件可能不止一个 -db --数据相关的"文件" -lib --common.py 项目所使用的到的一些公共的功能 -log --项目所有的日志文件(用户的操作,记录,浏览历史...) Readme.txt 项目的大致介绍 start.py (start.py也可以直接放在项目根目录下)
bin文件夹下,项目启动文件start.py的写法:
import os import sys 将项目名所在的路径添加到system path中,如果你是pycharm打开 pycharm会自动将顶级目录路径添加到system path中 而一旦你的项目不是用pycharm打开,亦或者是被用户下载到他自己的机器上,你就必须在项目启动之前将路径设置好 BASE_DIR = os.path.dirname(__file__) sys.path.append(BASE_DIR) from core import src if __name__ == '__main__': src.run()