前言
终于活过来了,电脑涅槃重生,还好养成了把东西存在了其余盘的习惯,让大部分东西在重装之后继续陪我走了下去,哈哈哈。
今天分享一下模块这块我认为值得分享的最后一点东西----包的使用,后面就进行到面向对象了。因为sys、os、hashlib、time,甚至于logging模块等等,只要掌握他的使用就好,理解也比较简单,大家随用随搜就ok。
引入
eg:time模块 一个py文件,200个函数,功能特别多,分文件,分三个文件,time文件夹:time1 time2 time3.py文件,这个time文件夹就叫做包
pycharm包的示例:
包的本质就是模块
无论从哪里引用模块,import 或者 from … import …最开始的模块名一定是sys.path中能找到的
直接import 为了让我们会使用 包里面的__init__
第一类:执行文件 通过import导入包以及包内的功能
-
创建一个ly包,自行创建一个__init__.py文件
-
发生三件事:
1、将ly文件夹内的__init__.py文件加载到内存
2、创建一个以ly命名的名称空间
3、通过ly.的方式引用__init__的所有的名字
-
-
示例:
运行结果:欢迎
1 -
引用 ly包的m1文件的a变量
做法依据:模块搜索路径 内存,内置,sys.path
m1不在内存,不在内置,sys.path会主动加载执行文件(包.py)的当前目录
解决方法:
- 1、在执行文件写入 import ly
- 2、ly的__init__里面写入 from ly import m1
- 3、然后执行文件 ly.m1.a
-
如何在当前文件中,引用ly包的ly1包
解决方法
-
1、在执行文件写入 import ly
-
2、ly的__init__里面写入 from ly import ly1
-
3、然后执行文件 ly.ly1 (引用变量或执行函数写在ly1包的__init__里)
-
import ly print(ly.ly1) ly1包的__init__里写入print('in ly1') 运行结果: in ly1 <module 'ly.ly1' from 'C:\\Users\\ASUS\\PycharmProjects\\pythonProject1\\18day\\ly\\ly1\\__init__.py'>
-
-
如何在当前文件中,引用ly包的ly1包变量name
-
print(ly.ly1.name)
-
-
如何在当前文件中,引用ly包的ly1包的m3文件的变量(函数)
解决方法:-
1、在执行文件写入 import ly
-
2、在ly包的__init__写入 from ly import ly1(这样写 ly包的__init__里面所有的名字都能引用)
-
3、在ly1包的 __init__ 写上from ly.ly1 import m3
-
4、执行ly.ly1.m3.find()
-
第二类:执行文件 通过from … import … 导入包以及包内的功能
- 规则:from a.b.c import d 通过这种方式不用设置_init_
- c的. 的前面一定是包
- import 的后面一定是名字,并且不能再有点
相对导入、绝对导入
最顶级包glance是写给别人用的,然后在glance包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式:
-
绝对导入:以当前执行文件所在目录 .的一系列导入
-
1、执行文件与模块同时处于一个文件夹下 调用
import nb
nb.f1()
nb.f2()
nb.f3()
nb.f4()
nb.f5()
nb.f6()
-
2、(当nb加入许多功能函数)由于nb模块增加了很多很多功能,所以我们nb这个文件就要划整一个包
无论对nb模块有任何操作,对于使用者来说不应该改变,极少的改变对其的调用
调用方式仍不变
-
3、当nb包与执行文件不在同一目录下,即执行文件与存放包的文件夹(相对导入与绝对导入)处于同一目录下时
import sys sys.path.append(r'nb包路径')
以上三种导入包方式import path/from path import…中的path均以执行文件所在目录为开始
即以glance作为起始
-
相对导入:. … …等
-
eg:将当绝对导入的第三种的NB文件夹名字改为其他时(nb)
执行文件内容修改如下:
import sys sys.path.append(r'G:\pythonProject\包\相对导入与绝对导入\dir') import nb as NB NB.f1() NB.f2() NB.f3() NB.f4() NB.f5() NB.f6()
仍发现错误,为__init__文件中并没有将nb改为NB
此时修改如下:
from .m1 import f1, f2
from .m2 import f3, f4
from .m3 import f5, f6
执行成功
. 即__init__的当前目录的m1文件 等价于nb.m1,防止修改名称后的导入错误
- 这种以 . … …等开始的导入为相对导入
- . 当前目录
- … 父级目录
- … 父级的父级目录