1.模块

  • 程序拆分,方便维护
  • 当做命名空间,同名模块有自己的路径
  • 模块编写规范:
  • 函数(单一功能)
  • 类(类描述相应的功能,如stu应有对应的功能)
  • 测试代码:例子(方便他人使用)
  • 导入
  • import module_name、module_name.class_name\fuction_name
  • as 起别名,**使用时只能用别名访问 **
  • from module_name import module_name,class_name \*
  • 如果未定义'if _name_ == "_main_" ',导入时相当于把模块代码粘贴到导入的位置
    • 可以有效避免模块代码被导入的时候被动执行的问题
    • 建议所有当前程序的入口都以此代码为入口

2. 模块的搜索路径和存储

  • 什么是模块的搜索路径:

    • 加载模块的时候,系统会在那些地方寻找此模块
  • 系统默认的模块搜索路径

      import sys
      sys.path 属性可以获取搜索路径列表
    
  • 添加搜索路径

       sys.path.append(dir)
    
  • 模块的加载顺序

    1. 搜索内存中已经加载好的模块
    2. 搜索python的内置模块
    3. 搜索sys.path路径

3.包

  • 包是一种组织管理代码的方式,包里面存放的是模块

  • 用于将模块包含在一起的文件夹就是包

  • 自定义包的结构

      |---包名
      |---|--- __init__.py  包的标志文件
      |---|--- 模块1
      |---|--- 模块2
      |---|--- 子包(子文件夹)
      |---|---|--- __init__.py  包的标志文件
      |---|---|--- 子包模块1
      |---|---|--- 子包模块2
    
  • 包的导入操作

    • import package_name

      • 直接导入一个包,只可以使用**_init_.py**中的内容

      • 使用方式是:

          package_name.func_name
          package_name.class_name.func_name()
        
      • 此种方式的访问内容是

    • import package_name as p

      • 具体用法跟作用方式,跟上述导入一致
      • 注意的是此种方法只对_init_.py内容的导入
    • import package.module

      • 导入包中某一个具体的模块,

      • 使用方法

          package.module.func_name
          package.module.class.fun()
          package.module.class.var
        
    • import package.module as pm

  • from ... import 导入

    • from package import module1, module2, module3, .....

    • 此种导入方法不执行__init__的内容

        from pkg01 import p01
        p01.sayHello()
      
    • from package import *

      • 导入当前包** __init__.py文件中**所有的函数和类

      • 使用方法

          func_name()
          class_name.func_name()
          class_name.var
        
  • from package.module import *

    • 导入包中指定的模块的所有内容

    • 使用方法

        func_name()
        class_name.func_name()  
      
  • 在开发环境中经常会所以用其他模块,可以在当前包中直接导入其他模块中的内容

    • import 完整的包或者模块的路径
  • __all__ 的用法:写在__init__中

    • 在使用from package import * 的时候, * 可以导入的内容
    • __init__.py中如果文件为空, 或者没有 __all__, 那么只可以把__init__中的内容导入
    • __init__ 如果设置了__all__的值,那么则按照__all__ 指定的子包或者模块进行加载 如此则不会载入__init__中的内容
    • __all__=['module1', 'module2', 'package1'.........]

4. 命名空间

  • 用于区分不同位置不同功能但相同名称的函数或者变量的一个特定前缀

  • 作用是防止命名冲突

      setName()
      Student.setName()
      Dog.setName()