模块,包的使用

---恢复内容开始---

一.包的定义:

包就是含有一个__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模块


原文地址:https://www.cnblogs.com/shengg/p/8746229.html