一、模块
二、模块导入
三、import导入模块和from ..import
四、循环导入与解决方法
五、__name__方法
六、模块的查找顺序
七、绝对导入与相对导入
--------------------------------------------------模块----------------------------------------------------------------------------
一、模块
1.1 模块的定义:
1.是什么 模块:一系列功能的结合体 模块的三种来源: 1.内置(python自带的) 2.第三方库(别人写的) 3.自己写的(自定义) 模块的四种体现: 1.使用python编写的.py文件(一个py文件也可以称之为模块) 2.已被编译为共享库或DLL的C或C++扩展 3.把一系列模块组合到一起的文件夹(文件夹下有__init__.py文件) 4.使用C编写并连接到python解释器的内置模块
1.2 为什么用模块
2.为什么 1.用别人写的模块(内置或的第三方库):典型的拿来注意,可以帮助我们极大提高开发开发效率,当下开发的精髓以效率优先 2.使用我们自己写的模块(自定义):当程序比较庞大的时候,我们此时项目会有很多个.py文件,假若有很多py文件都需要是同时用到 用到同一个的共能,我可以将该公共功能写到一个人py文件中,其他文件以模块的形式导入,@common.login 直接调用
1.3 如何用模块
3.如何使用
注意:区分那个时导入文件 那个是被导入文件
"""
二、模块的导入
""" 右键运行a.py 名称空间会发生哪些写事:>>>首先会创建一个a.py的名称空间 首次导入模块(d.py)(*****) 1.执行d.py文件 2.运行md.py文件中的代码将产生的名字和值放到b.py名称空间中 3.在执行文件中产生一个指向名称空间的名字(变量) 补充:多次导入不会重复执行模块文件,会沿用第一次导入的结果
右键运行导入的模块名称空间的变化:模块与函数、值’
三、import 导入模块
3.1 import导入模块的方式
# 访问名称空间的名字统一的局势:模块名.名字 # 1.指名道姓的访问模块中的名字,永远不会与执行中的名字冲突 # 2.如果想访问模块中的名字, 必须用模块名.名字的方式
imoprt 右键运行和from...import... 的区别
import import md 文件名带后缀 模块名在导入的时候不要加后缀 首次导入 先创建执行文件名称空间 1.创建md.py文件名称空间 2.运行md.py文件内的代码,将产生的名字放到md.py文件的名称空间中 3.在执行文件中拿到一个md执行md.py的名称空间 import句式访问模块名称空间中的名字固定写法:模块名.名字 md.name 好处在于指名道姓的跟某个模块要名字,不会与当前执行文件名字冲突 知识点补充 当模块名比较复杂的时候 可以给模块名起别名 重复导入:不会再执行模块文件 直接沿用首次导入模块的成果
3.2 impor 模块的规则
# 注意:import os , # import sys # import time # 导包规则: # 导包规则: # 1.如果几个模块有相同的部分 或者属于同一个模块,可以使用逗号,的方法;没有非关系需要隔行写 # 2.通常导入模块的句式会写在文件的开头 # 3.当文件名比较复杂的时候可以考虑给模块器别名
3.3 from ... import ... 导入模块的语句及方式
from...import...
首次导入
先创建执行文件名称空间
1.创建md.py文件名称空间
2.运行md.py文件内的代码,将产生的名字放到md.py文件的名称空间中
3.在执行文件中拿到一个名字改名字直接指向md.py名称空间中的某个名字
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自动补全上面的格式
3.4 规则:
# 规则 # 1. from 模块 import 文件模块 需要注意的是如果只是一级直接导模块 如果是多级需要通过外层点模块才能导入 # 缺点: # 1.访问模块中的名字不需要加模块名前缀(不推荐) # 2.模块中的名字可能会与执行文件中的名字冲突() # 3.from import * 会将所有的模块以及名字导过来 >>>解决方案:__all__ = [模块,元素,] 设置被导入文件中__all__ = [] # (上面的__all__ = [] 可以指定被导入元素的个数)
四、循环导入以及解决方案 (重新写)
pycharm中可以写main+tab自动补全上面的格式 循环导入 你导了我 我导了你 循环导入的问题 在你的程序中应该尽量避免 1.解决循环导入方式1 将循环导入的语句放在要导入的名字的语句下方 2.解决循环导入方式2 将导入语句写到函数体代码内(利用函数在定义阶段只检测语法不执行代码) 3.解决循环导入方式3(******) 将循环导入的名字 放到另外一个文件中
一般不建议写循环导入,可以件我们要得到的变量提到导入函数前
五、__name__方法
from t1 import a1 def f3(): print('666') print(__name__) # 自执行文件 if __name__ == '__main__': f3() # t1.a1 # print(__Name__)是返回模块名 # __main__ # 666
1. 如果是自执行文件我们显示的结果是666 若是被导入文件:我们在被导入放print(__name__) 返回的是被导入模块的名字
六、模块的查找循序
# 模块查找顺序: # >>> 内存(文件执行的时候已经加载到内存了:tiemnsleep(4))>>> 内置(如果时time作为函数名 内置的将会报错)》》sys.path import time def func(): # time.sleep(5) print('111') print('2222') func() from ddd.dab import time # 我们在time.sleep() 延迟5期间内我们可以删除from ddd.dab import b :但是的d.f2()任然会执行 所以可以验证我们先找内存 print(tiem.name) # 直报错
模块的查找顺序 1.先在内存中找 2.内置 3.system path(程序的环境变量) 查找模块的路径以执行文件所在的文件夹为准 demo -dir --md.py -run.py 第一种导入:基于当前执行文件所在文件夹路径依次往下找 第二种导入:直接将你需要导入的那个模块所在的文件夹路径添加到system path中
六、绝对导入与相对导入
# 绝对导入和相对导入 # 1.绝对导入必须是依据执行文件所在的路径为准 # 2.绝对导入无论在执行文件还是被导入文件中都适用 # 相对导入: # .代表当前路 # ..代表上一层路径 # ...代表上上一级路径 # 注意相对路径不能在执行文件中使用,只能在被导入的模块中使用,使用相对导入 就不需要考虑 # 执行文件到底是谁,只需要知道模块与模块之间的路径关系
绝对导入与相对导入
绝对导入写的就是全路径 该全路径以执行文件所在的文件夹路径为基准
相对导入
.代表当前路径
..代表上一级路径
...代表上上一级路径
注意相对导入只能在模块文件中使用,执行文件中不能使用相对导入
一般情况下项目只会有一个执行文件,项目的其他文件其实都是模块
所以相对导入的应用场景也是很广泛
绝对导入的利弊:
绝对导入是首选,因为它们非常明确和直接。仅仅通过查看语句就可以很容易地确定导入资源的位置。此外,即使导入语句的当前位置发生更改,绝对导入仍然有效。事实上,PEP 8明确建议绝对导入。 然而,有时,绝对导入会变得相当冗长,这取决于目录结构的复杂性。想象一下有这样的语句:from package1.subpackage2.subpackage3.subpackage4.module5 import function6 那太荒谬了,对吧?幸运的是,在这种情况下,相对导入是一个很好的选择! 作者:妄心xyx 链接:https://www.jianshu.com/p/f6cd59ca6f0c 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
相对导入的利弊:
相对导入的一个明显优势是它们相当简练。根据当前位置,它们可以将你之前看到的冗长的可笑的导入语句转换为如下简单的语句:
Python中的绝对导入和相对导入,解决了我很多困惑,区别在这里!
不幸的是,相对导入可能是混乱的,特别是对于目录结构可能改变的共享项目。相对导入也不像绝对导入一样可读,而且很难识别导入资源的位置。
绝对导入: 以执行文件的sys.path为起始点开始导入,称之为绝对导入
优点: 执行文件与被导入的模块中都可以使用
缺点: 所有导入都是以sys.path为起始点,导入麻烦
相对导入: 参照当前所在文件的文件夹为起始开始查找,称之为相对导入
符号: .代表当前所在文件的文件加,..代表上一级文件夹,...代表上一级的上一级文件夹
优点: 导入更加简单
缺点: 只能在导入包中的模块时才能使用,不能在执行文件中用
七、软件开发目录规范:
软件开发目录规范 1.项目结构更清晰 2.便于管理 3.扩展性高 项目名 -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也可以直接放在项目根目录下) 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()