zoukankan      html  css  js  c++  java
  • 模块,包的使用

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

    一.包的定义:

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

    
    
  • 相关阅读:
    树莓派常用Linux命令
    列出树莓派中系统中建立了哪些用户、哪些组?
    树莓派的用户管理
    树莓派变成一个Web服务器: nginx + php + sqlite
    树莓派做web服务器(nginx、Apache)
    树莓派修改更新源
    树莓派安装mysql
    树莓派2 购买心得
    python写的屏保程序
    win32下利用python操作printer
  • 原文地址:https://www.cnblogs.com/shengg/p/8746229.html
Copyright © 2011-2022 走看看