python模块原理

什么是模块

模块就是一系列功能的集合体
模块有三种来源

  1. 内置的模块
  2. 第三方的模块
  3. 自定义模块
    模块的格式:
    1 使用python编写的.py文件
    2 已被编译为共享库或DLL的C或C++扩展
    3 把一系列模块组织到一起的文件夹(注:文件夹下有一个init.py文件,该文件夹称之为包)
    4 使用C编写并链接到python解释器的内置模块

为什么要用模块

  1. 使用内置的或者第三方模块的好处是: 拿来主义,可以极大提升开发效率
  2. 使用自定义模块的好处是: 可以减少代码冗余(抽取我们自己程序中要公用的一些功能定义成模块,然后程序的各部分组件都去模块中调用共享的功能)

怎么用模块

​ 大前提: 一定要区分开谁是执行文件,谁是被导入模块
文件名是spam.py,模块名则是spam

首次导入模块发生3件事

  1. 会产生一个模块的名称空间

  2. 执行文件spam.py,将执行过程中产生的名字都放到模块的名称空间中

  3. 在当前执行文件的名称空间中拿到一个模块名,该名字指向模块的名称空间
    之后的导入,都是直接引用第一次导入的成果,不会重新执行文件
    总结import导入模块:在使用时必须加上前缀:模块名.
    优点: 指名道姓地向某一个名称空间要名字,肯定不会与当前名称空间中的名字冲突
    缺点: 但凡应用模块中的名字都需要加前缀,不够简洁
    总结from…import…
    优点: 使用时,无需再加前缀,更简洁
    缺点: 容易与当前名称空间中的名字冲突

模块的循环导入问题

​ 解决方案一: 把循环导入的语句放到名字定义的后面
解决方案二: 将循环导入语句放到函数内

区分python文件的2种用途

1
if __name__ == '__main__':

模块搜索的优先级

​ 模块搜索路径的优先级

  1. 内存中已经加载过的
  2. 内置模块
  3. sys.path # 第一个值是当前执行文件所在的文件夹
    环境变量是以当前执行文件为准的
    强调:所有被导入的模块参照环境变量sys.path都是以执行文件为准的
    所有被导入的模块再去导入其他模块,参考的都是执行文件的sys.path

绝对导入与相对导入(模块)

绝对导入: 以执行文件的sys.path为起始点开始导入,称之为绝对导入
优点: 执行文件与被导入的模块中都可以使用
缺点: 所有导入都是以sys.path为起始点,导入麻烦
相对导入: 参照当前所在文件的文件夹为起始开始查找,称之为相对导入
符号: .代表当前所在文件的文件加,..代表上一级文件夹,…代表上一级的上一级文件夹
优点: 导入更加简单
缺点: 只能在导入包中的模块时才能使用,不能在执行文件中用

图灵python大海老师 wechat
python分享公众号
坚持原创技术分享,您的支持将鼓励我继续创作!