python—包

278 阅读2分钟

1.模块

  • 可以增加代码的重复利用的方式

  • 避免命名冲突

  • 如何定义模块

    • 模块就是一个普通文件,所以任何代码可以直接书写
    • 规范
      • 函数(单一的功能)
      • 类(相似功能的组合,或者类似业务模块)
      • 测试代码
  • 如何使用模块

    • 模块直接导入

      • 假如模块名称直接以数字开头,需要借助importlib帮助
    • 语法

      import module_name
      module_name.function_name
      module_name.class_name
      
    • import 模块 as 别名

      • 导入的同时给模块起一个别名,其余用法和第一种一样
    • from module_name import func_name, class_name

      • 有选择性导入,模块的一部分
    • import module_name import *

      • 导入模块所有内容
      • 不需要模块前缀
  • if name = 'main'的使用

    • 可以有效避免模块代码被导入的时候被动执行的问题
    • 建议所有程序的入口都以此代码为入口

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

  • 什么是模块的搜索路径

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

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

       sys.path.append(dir)
    

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

  • 自定义包的结构

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

    • importpackage_name
      • 直接导入一个包,可以使用__init__.py 中的内容

      • 使用方法

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

  • from ... import 导入

    • from package import module1,module2,module3...
    • 此种方法不执行__init__.py 的内容
    • form package import *
    • 导入当前包__init__.py 文件中的所有函数和内容,没有前缀
  • from package.module import *

    • 导入保重指定模块的所有内容
  • 在开发环境中经常会使用其他模块,可以直接导入其他模块中的内容

    • import 完整包或者模块的路径
  • __all__的用法

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

命名空间

  • 用于区分不同位置不同功能但相同名称的函数变量的一个特定前缀
  • 作用是防止命名冲突