---恢复内容开始---
一.包的定义:
包就是含有一个__init__.py文件的文件夹,创建包的目的就是为了用文件夹将文件/模块组织起来
强调:
1️⃣在python3中包即使没有__init__.py文件也不会报错,但在python2中必须要有
2️⃣创建包的目的不是执行,而是被导入使用,包只是模块的一种形式而已,包本质也是模块
二.为何使用包
包的本质就是一个文件夹,文件夹的唯一功能就是将文件组织起来
随着功能越写越多,无法将所有功能存放与一个文件中,于是使用模块去组织功能,而随着模块越写越多,我们就需要用文件将模块文件组织起来,以此来提高程序的结构性和可维护性
三.需要注意的几个事项
1️⃣包导入的语句为import和from....import......两种,都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法,可以带一连串的点比如:item.subitem.subsubitem,但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)
2️⃣import导入文件的时,产生的名称空间来源于文件,import包,产生的名称空间的名字同样来源于文件,所以包下的__init__.py导入包的本质就是导入该文件
3️⃣两个不同的包含有同名的模块也不会冲突,如A.a和B.b来着两个命名空间
四。包的使用
1.产生一个包的名称空间
2.执行包下的__init__.py文件,将产生的名字存放于包的名称空间中
3.在当前执行文件中拿到一个名字aaa,该名字指向包的名称空间
实验一
准备:
执行文件为test.py,内容
#test.py
import aaa
同级目录下创建目录aaa,然后自建空__init__.py(或者干脆建包)
需求:验证导入包就是在导入包下的__init__.py
解决:
先执行看结果
再在__init__.py添加打印信息后,重新执行
2、实验二
准备:基于上面的结果
需求:
aaa.x
aaa.y
解决:在__init__.py中定义名字x和y
3、实验三
准备:在aaa下建立m1.py和m2.py
#m1.py
def f1():
print('from 1')
#m2.py
def f2():
print('from 2')
需求:
aaa.m1 #进而aaa.m1.func1()
aaa.m2 #进而aaa.m2.func2()
解决:在__init__.py中定义名字m1和m2,先定义一个普通变量,再引出如何导入模块名,强调:环境变量是以执行文件为准
4、实验四
准备:在aaa下新建包bbb
需求:
aaa.bbb
解决:在aaa的__init__.py内导入名字bbb
5、实验五
准备:
在bbb下建立模块m3.py
#m3.py
def f3():
print('from 3')
需求:
aaa.bbb.m3 #进而aaa.bbb.m3.f3()
解决:是bbb下的名字m3,因而要在bbb的__init__.py文件中导入名字m3,from aaa.bbb import m3
6、实验六
准备:基于上面的结果
需求:
aaa.m1()
aaa.m2()
aaa.m3()
进而实现
aaa.f1()
aaa.f2()
aaa.f3()
先用绝对导入,再用相对导入
解决:在aaa的__init__.py中拿到名字m1、m2、m3
包内模块直接的相对导入,强调包的本质:包内的模块是用来被导入的,而不是被执行的
用户无法区分模块是文件还是一个包,我们定义包是为了方便开发者维护
7、实验七
将包整理当做一个模块,移动到别的目录下,操作sys.path
五。包的import使用
import aaa
'''
1 产生一个包的名称空间
2 执行包下的__init__.py文件,将产生的名字存放于包的名称空间中
3 在当前执行文件中拿到一个名字aaa,该名字指向包的名称空间
'''
六。包的from。。。import。。。使用
强调:
1.在导入带点的,点左边必须是一个包,这是导入包特有的语法
2.包内,模块直接的导入应该使用from.....import......
3.from....import.....import后面必须有明确的名字,没有任何的前缀
from a.b.c.d import g.h.x(错误)
f左边必须是包,import后的名字不能有任何前缀
七。相对路径和绝对路径
绝对路径的模块如果一旦需要改变就非常麻烦,动用的东西非常多,所以就需要使用相对路径
比如:
# from nb import m1,m2,m3
# # 绝对导入
# from nb.m1 import f1,f2
# from nb.m2 import f3,f4
# from nb.m3 import f5,f6
# from nb.p1.m4 import f7
# 相对导入
from .m1 import f1,f2
from .m2 import f3,f4
from .m3 import f5,f6
from .p1.m4 import f7
from ..m1 import f1
注意:点是在找当前目录,点点是找当前目录的上一层目录
八。import time时间分为三种形式
1️⃣时间戳
print(time.time())
2️⃣格式化的字符串
print(time.strftime('%Y-%m-%d' %H:%M:%S %p'))
print(time.strftime('%Y-%m-%d %X %p'))#X代表的是H,M,S
3.struct_time对象
print(time.localtime()) # 上海:东八区
print(time.localtime().tm_year)
print(time.localtime().tm_mday)
print(time.gmtime()) # UTC时区(和东八区相差八个小时)
九。datetime模块
import datetime
print(datetime.datetime.now())#得出当前时间
print(datetime.datetime.now()+datetime.timedelta(days=4))#当前时间加4天
current_time=datetime.datetime.now()
print(current_time.replace(year=1997))#(替换当前的年)
十。打印进度条
def progress(percent,width=50):
if percent > 1:
percent=1
show_str=('[%%-%ds]' %width) %(int(width*percent) * '#')
print('
%s %d%%' %(show_str,int(100*percent)),end='')
import time
recv_size=0
total_size=8097
while recv_size < total_size:
time.sleep(0.1)
recv_size+=8096
percent=recv_size / total_size
progress(percent)
十一。shutil模块