一、模块
1、定义:就是一系列功能的结合体
2、模块的三种来源:
①、内置的(Python解释器自带)
②、第三方的(别人写的)
③、自定义的(你自己写的)
3、模块的四种表现形式
①、使用Python编写的py文件(也就意味着py文件也可以称之为模块:一个py文件也可以称之为一个模块)
②、已被编译为共享库或DLL的c或c++扩展(了解)
③、把一系列模块组织到一起的文件夹(文件夹下有一个__init__.py文件,改文件称之为包)
④、使用c编写并连接到Python解释器的内置模块
4、使用模块的好处
①、用别人写好的模块(内置的,第三方的):典型的拿来主义,极大地提高开发效率
②、使用自己写的模块(自定义的):当程序比较庞大的时候,你的项目不可能只在一个py文件中,
那么当多个文件中都需要使用相同的方法的时候,可以将该公共的方法写到一个py文件中,其他的文件以模块的
形式导过去直接调用即可
5、使用模块的注意点:一定要区分哪个是执行文件,哪个是被导入文件
二、使用import导入模块
1、执行过程
①、右键运行run.py问价首先会创建一个run.py的名称空间
②、首次导入模块(md.py)
执行md.py文件
运行md.py文件中的代码将产生的名字与值存放到md.py名称空间中
在执行文件中产生一个指向名称空间的名字(md)
多次导入不会再执行模块文件,会沿用第一次导入的成果(******)
2、访问模块中的名字指向的值,使用import导入模块,访问模块名称空间中的名字统一句式:模块名.名字
print(md.money)
md.resd1()
md.resd2()
3、只要你能拿到函数名无论在哪都可以通过函数名加括号调用这个函数(会回到函数定义阶段,依次执行代码),函数在定义阶段,名字的查找就已经固定死了,不会因为调用位置的变化而变化
4、使用import导入模块,访问模块名称空间中的名字统一句式:模块名.名字
①、指名道姓的访问模块中的名字,永远不会与执行文件中的名字冲突
②、你如果想访问模块中的名字必须用模块名.名字的方式
5、当几个模块没有联系的情况下,应该分多次导入,通常导入模块的句式会写在文件的开头
import os import time import sys
6、当几个模块有相同的部分或属于同一个模块时,可以将他们写在一起
import read,read1,read2
7、 当模块名字比较复杂的情况下,可以给该模块取别名
import aaabbbcccdddfff as a
8、补充:异常有两大类
①、语法结构错误:需要你当场处理,异常捕获没法完成
②、逻辑错误:异常捕获可以完成
三、使用from...import...导入模块
1、缺点:访问模块中的名字不需要解模块名前缀,访问模块中的名字时可能会与当前执行文件中的名字冲突
2、补充
from md1 import *
使用上面这个句式,导入模块,会一次性将md1模块中的名字全部加载过来,不推荐使用,并且根本不知道到底有哪些名字可以用
3、__all__
当所在py文件被当做模块导入的时候,如果不指定__all__的参数,则会将该py文件中所有的名字全部导入过去,指定参数的话,就可以指定哪些名字可以被导入过去,哪些不可以。
4、from...import...的两种用法
①、from 文件名 import 名字(可以有多个)
②、from 文件夹1.文件夹2 import 文件名(当前目录下没有该文件,该文件在当前目录的文件夹1下的文件夹2下)
四、循环导入问题及解决思路
1、循环导入指的是文件的互相导入
2、出现循环导入问题,一定是你的程序设计不合理,应该在程序设计阶段就避免。
3、解决循环导入问题的方式
①、方式一:将循环导入的语句写在文件最下方(文件内所有的名字已经初始化完毕)
②、方式二:函数内导入模块(执行函数时才会导入模块)
五、__name__的用法
1、当文件被当做执行文件执行的时候__name__打印的结果是__main__
2、当文件被当做模块导入的时候__name__打印的结果是模块名(没有后缀)
3、用途:
主要用在启动文件中,当启动文件是主动执行的时候,才会执行启动程序,如果是被当做模块导入时,就不会执行启动程序。
if __name__ == '__main'__: src.run()
4、上述语句的快捷写法:main直接按tab键
六、模块的查找顺序
1、模块的查找顺序:
①、先从内存中找
②、再从内置中找
③、最后在sys.path中找(可以理解为环境变量),sys.path是一个大列表,里面放了一堆文件路径,第一个路径永远是执行文件所在的文件夹
2、注意点:一定分清楚谁是执行文件谁是被导入文件(******),py文件名不应该与模块名(内置的,第三方的)冲突
3、将文件路径添加到sys.path中
import sys sys.path.append(r'D:Python项目dir1') from dir1.dir import md # 当需要导入的模块不在执行文件的目录下时,可以利用这种方式找到模块文件 # 缺点:添加的路径太过绝对,用户自定义安装后会导致该路径失效,软件崩溃。
七、模块的绝对导入
1、绝对导入必须依据文件所在的文件夹路径为准,绝对导入无论在执行文件中还是被导入文件都适用
2、相对导入
①、.代表当前路径
②、..代表上一级路径
③、...代表上上一级路径
注意:相对导入不能在执行文件中使用,相对导入只能在被导入的模块中使用,使用相对导入,就不需要考虑
执行文件到底是谁,只需要知道模块与模块之间路径关系
八、软件开发目录规范
项目名 bin start.py(项目启动文件) conf settings.py(项目配置文件) core src.py(项目核心逻辑) db 数据库相关文件 lib common.py(项目所用到的公共的功能) log log.log(项目的日志文件) readme.txt(项目简介)
1、strat.py
import os import sys BASE_DIR = os.path.dirname(os.path.dirname(__file__)) sys.path.append(BASE_DIR) """ pycharm会自动将你新建的最顶层的目录添加到sys.path中 上面这两句话,不是针对你的,是针对下载你这个软件的用户 """ from core import src if __name__ == "__main__": src.run() # 当start.py文件主动执行时才会调用src.run()函数 # 1.将core文件路径添加到system path中 (...太low) # 2.将项目文件夹添加到system path中
注意:不要手动拼接路径,跨系统时可能会出错