zoukankan      html  css  js  c++  java
  • python之模块与包

    一、什么是模块?

      简单概括一下模块就是一组功能的集合体

      查看一下内置的模块:

        由此可见模块可以是一个py文件 ,模块的名字就是os 

      

      

    二、模块的使用

      1.模块的导入

        模块的导入有两种方法,第一种用来导入默认路径(os.system())下的模块使用import,第二种用来导入其他路径下模块需要from import关联使用

    1 import os   
    2 # 本质上就是调用os.py文件,在模块与包的概念中称之为os模块
    3 from 课程练习 import my_module 
    4 # 什么时候会用到from import 关联来使用呢? 
    5 # import 导入的是一个路径,在这个路径下找到py文件,而当我们需要找的py文件不在这个路径下的时候,
    6 # 我们就需要通过from 找到 这个py文件所在的路径, 然后在从这个路径下找到py文件,这里from 与improt关联来使用

      2.为模块起别名

        就是为了方便使用,将长或者不容易理解的模块名字重新命名。

    1 import os as cz
    2 cz.remove("")
    3 # 通过上述代码可以观察到,模块可以重新赋值一个全新的名字,并且其中内部的函数都可以被使用,
    4 
    5 import asjdlasjdoaisud as of
    6 # 我们什么时候会用到模块的重名名? 当然如果我们需要用到一个模块,而模块的名字又非常长,这时候我们可以为模块起别名

      3.模块循环导入问题

        模块循环/嵌套导入抛出异常的根本原因是由于在python中模块被导入一次之后,就不会重新导入,只会在第一次导入时执行模块内代码

      在我们的项目中应该尽量避免出现循环/嵌套导入,如果出现多个模块都需要共享的数据,可以将共享的数据集中存放到某一个地方

      在程序出现了循环/嵌套导入后的异常分析、解决方法

      

    #示范文件内容如下
    #m1.py
    print('正在导入m1')
    from m2 import y
    
    x='m1'
    
    #m2.py
    print('正在导入m2')
    from m1 import x
    
    y='m2'
    
    #run.py
    import m1
    
    #测试一
    执行run.py会抛出异常
    正在导入m1
    正在导入m2
    Traceback (most recent call last):
      File "/Users/linhaifeng/PycharmProjects/pro01/1 aaaa练习目录/aa.py", line 1, in <module>
        import m1
      File "/Users/linhaifeng/PycharmProjects/pro01/1 aaaa练习目录/m1.py", line 2, in <module>
        from m2 import y
      File "/Users/linhaifeng/PycharmProjects/pro01/1 aaaa练习目录/m2.py", line 2, in <module>
        from m1 import x
    ImportError: cannot import name 'x'
    
    #测试一结果分析
    先执行run.py--->执行import m1,开始导入m1并运行其内部代码--->打印内容"正在导入m1"
    --->执行from m2 import y 开始导入m2并运行其内部代码--->打印内容“正在导入m2”--->执行from m1 import x,由于m1已经被导入过了,所以不会重新导入,所以直接去m1中拿x,然而x此时并没有存在于m1中,所以报错
    
    
    #测试二:执行文件不等于导入文件,比如执行m1.py不等于导入了m1
    直接执行m1.py抛出异常
    正在导入m1
    正在导入m2
    正在导入m1
    Traceback (most recent call last):
      File "/Users/linhaifeng/PycharmProjects/pro01/1 aaaa练习目录/m1.py", line 2, in <module>
        from m2 import y
      File "/Users/linhaifeng/PycharmProjects/pro01/1 aaaa练习目录/m2.py", line 2, in <module>
        from m1 import x
      File "/Users/linhaifeng/PycharmProjects/pro01/1 aaaa练习目录/m1.py", line 2, in <module>
        from m2 import y
    ImportError: cannot import name 'y'
    
    
    #测试二分析
    执行m1.py,打印“正在导入m1”,执行from m2 import y ,导入m2进而执行m2.py内部代码--->打印"正在导入m2",执行from m1 import x,此时m1是第一次被导入,执行m1.py并不等于导入了m1,于是开始导入m1并执行其内部代码--->打印"正在导入m1",执行from m1 import y,由于m1已经被导入过了,所以无需继续导入而直接问m2要y,然而y此时并没有存在于m2中所以报错
    
    
    
    # 解决方法:
    方法一:导入语句放到最后
    #m1.py
    print('正在导入m1')
    
    x='m1'
    
    from m2 import y
    
    #m2.py
    print('正在导入m2')
    y='m2'
    
    from m1 import x
    
    方法二:导入语句放到函数中
    #m1.py
    print('正在导入m1')
    
    def f1():
        from m2 import y
        print(x,y)
    
    x = 'm1'
    
    # f1()
    
    #m2.py
    print('正在导入m2')
    
    def f2():
        from m1 import x
        print(x,y)
    
    y = 'm2'
    
    #run.py
    import m1
    
    m1.f1()
    
    示例文件
    

      

    三、什么是包?

      包只是模块的一种形式而已,包的本质就是一种模块

      

      

      包就是一个包含有__init__.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来

     四、包的使用

      1.为什么会用到包?  

        包的本质就是一个文件夹,那么文件夹唯一的功能就是将文件组织起来随着功能越写越多,我们无法将所以功能都放到一个文件中,于是我们使用模块去组织功能,而随
      着模块越来越多,我们就需要用文件夹将模块文件组织起来,以此来提高程序的结构性和可维护性
     2.包的导入
       
     1 绝对导入与相对导入
     2 
     3 # 绝对导入: 以执行文件的sys.path为起始点开始导入,称之为绝对导入
     4 #        优点: 执行文件与被导入的模块中都可以使用
     5 #        缺点: 所有导入都是以sys.path为起始点,导入麻烦
     6 
     7 # 相对导入: 参照当前所在文件的文件夹为起始开始查找,称之为相对导入
     8 #        符号: .代表当前所在文件的文件加,..代表上一级文件夹,...代表上一级的上一级文件夹
     9 #        优点: 导入更加简单
    10 #        缺点: 只能在导入包中的模块时才能使用
    11       #注意:
    12         1. 相对导入只能用于包内部模块之间的相互导入,导入者与被导入者都必须存在于一个包内
    13         2. attempted relative import beyond top-level package # 试图在顶级包之外使用相对导入是错误的,言外之意,必须在顶级包内使用相对导入,每增加一个.代表跳到上一级文件夹,而上一级不应该超出顶级包
     
  • 相关阅读:
    2019-2020-1学期 20192419 《网络空间安全专业导论》第一周学习总结 (读书心得)
    2019-2020-1学期 20192419 《网络空间安全专业导论》第一周学习总结 (读书笔记)
    DFA最小化,语法分析初步
    作业8非确定的自动机NFA确定化为DFA
    作业7 正规式、正规文法与自动机
    作业6 正规文法与正规式
    作业5 词法分析程序的设计与实现
    作业4 文法和语言总结与梳理
    作业3 语法树,短语,直接短语,句柄
    作业2理解文法和语文
  • 原文地址:https://www.cnblogs.com/qq631243523/p/9525902.html
Copyright © 2011-2022 走看看