• Python 模块与包


    一、什么是包?

    包是一个内部带有__init__.py的文件夹,包也可以被导入,并且可以一并导入包下的所有模块。

    二、为什么要使用包?

    包的本质就是一个文件夹,那么文件夹唯一的功能就是将文件组织起来。
    随着功能越写越多,我们无法将所有功能都放到一个文件中,于是我们使用模块去组织功能,而随着模块越来越多,我们就需要用文件夹将模块文件组织起来,以此来提高程序的结构性和可维护性。
    在包中有一个__init__.py, 由它来帮我们管理模块。

    三、怎么使用包?

    1. import 包.模块名
    2. from 包 import 模块名
    3. from 包.模块名 import 模块中的名字

    导入包时发生的事情:

    1. 当包被导入时,会执行包中的__init__.py,产生一个名称空间。
    2. ,会将__init__.py中的所有名字添加到名称空间中。
    3. 接着会将包下所有的模块的名字加载到__init__.py产生的名称空间中。
    4. 导入的模块指向的名称空间其实就是__init__.py产生的名称空间。

    强调
      在python3中,即使包里面没有__init__.py文件,import 包仍然不会报错,而在python2中,包里面一定要有该文件,否则import 包报错

    模块

    一、 什么是模块?

    模块是一系列功能代码的集合体。
    在Python中,一个.py文件就是一个模块,文件名为xxx.py模块名则是xxx,导入模块可以引用模块中已经写好的功能

    - 模块的三种来源:
        1.python内置的模块: (python解释器的)
            比如: sys	imeos	urtle
    
        2.第三方的模块: (别人写的)
            比如: requests
    
        3.程序员自定义的模块: (自己写的)
            比如: 自己定义的demo.py文件
    
    - 模块的四种表现形式:
        1.使用python编写的py文件。(了解)
        2.编译后的共享库DLL或者是C或者C++库。(了解)
        3.包下面带有__init__.py的一组py文件。
            - 包
                - __init__.py
                - demo.py
                - demo2.py
        4.python解释器下的py文件。
            - python解释器下的文件夹
               - 一个个的py文件
    

    二、 为什么要使用模块?

    • 模块可以帮我们更好地管理功能代码,比如: 函数...
    • 可以将项目拆分成一个个的功能,分别存放在不同的py文件(模块)中。

    三、 如何创建,编写模块,并使用模块?

    • 鼠标右键创建py文件
      - 在py文件编写python代码

    • 在一个文件中,通过import关键字导入模块
      import 模块名
      注意: import 模块时,模块不能加.py后缀

    • 在使用模块阶段,必须要注意,谁是执行文件,谁是被导入文件(被导入的模块)

    • 模块在首次导入时,导入的模块已经将其加载到内存空间了,之后的重复导入会直接引用内存中已存在的模块,不会重复执行文件,通过import sys,打印sys.modules的值可以看到内存中已经加载的模块名。

    • 在文件开头导入模块属于全局作用域,在函数内导入的模块则属于局部的作用域。

    模块在导入时发生的事情:

    1. 会先执行当前执行文件,并生成当前执行文件的的名称空间。
    2. 当执行到被导入模块的代码时,被导入的模块会产生一个模块的名称空间。
    3. 将被导入模块的名称空间加载到内存中。
    import foo      #导入模块foo
    a=foo.x 		#引用模块foo中变量x的值赋值给当前名称空间中的名字a
    foo.get() 		#调用模块foo的get函数
    foo.change() 	#调用模块foo中的change函数
    
    • 给模块起别名 as
      import 模块 as 模块的别名

    四、 模块的导入方式

    • import 模块名
      - 在执行文件中直接import导入

    • from 包/模块名 import 模块名/(函数名、变量名、类名)
      - 在执行文件中直接import导入

    五、 循环导入问题

        - m1.py
            print('正在导入m1')
    		from m2 import y
    		x='m1'
    
        - m2.py
            print('正在导入m2')
    		from m1 import x
    	- run.py
    		import m1                #执行run.py会报错
    
    
        - 解决循环导入问题:
            1.需要查找的名字放在导入模块的上方
            2.在函数内部导入,将模块加载到局部名称空间中
    

    六、 py文件区分两种用途:模块与脚本

    编写好的一个python文件可以有两种用途:
        一:脚本,一个文件就是整个程序,用来被执行
        二:模块,文件中存放着一堆功能,用来被导入使用
        
    print(__name__)
    
    __name__的值:
    
    1、在文件被直接执行的情况下,等于'__main__'
    2、在文件被导入的情况下,等于模块名
    
    作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
    
    if __name__ =='__main__'
    	func()
    

    七、 模块的搜索路径

    模块的查找顺序

    1. 内存中已经加载的模块
    2. 内置模块
    3. sys.path路径中包含的模块

    强调:sys.path的第一个路径是当前执行文件所在的文件夹

    import sys
    print(sys.path)   
    
    import sys
    print(sys.modules)  #查找内存中存在的模块
    
  • 相关阅读:
    查找->静态查找表->顺序查找(顺序表)
    查找(总结篇)
    树和二叉树->其他(待完善)
    树和二叉树->最优二叉树
    树和二叉树->线索二叉树
    树和二叉树->遍历
    树和二叉树->相互转化
    树和二叉树->存储结构
    树和二叉树->基础知识
    P2921-[USACO08DEC]在农场万圣节Trick or Treat on the Farm
  • 原文地址:https://www.cnblogs.com/baohanblog/p/12143049.html
Copyright © 2020-2023  润新知