模块 --- 最高级别程序组织单元

《Python学习手册》笔记

import 导入1个模块
from 获取模块指定变量名
imp.reload 重新载入模块文件代码的方法

模块作用

  1. 代码复用;
  2. 系统命名空间的划分;
  3. 实现共享服务和数据(跨系统共享组件);

import工作:

  1. 搜索;
  2. 编译;
  3. 运行。

模块搜索路径

  1. 程序主目录;
  2. PYTHONPATH目录(环境变量);
  3. 标准链接库;
  4. 任何.pth文件内容;
    上面4步构成sys.path(模块搜索路径),sys.path可以查看当前搜索路径列表。

导入模块文件

  1. 源代码文件name.py;
  2. 字节码文件name.pyc;
  3. 目录name,包导入;
  4. 编译的扩展模块(通常为C/C++),导入时使用动态链接;
  5. 用C编写好的内置模块,通过静态连接至Python;
  6. ZIP文件组件,导入时自动解压;
  7. 内存映像,对于frozen可执行文件;;
  8. Java类(JPython);
  9. .Net组件(IronPython)。

import 导入

  1. from * 表示导入模块所有变量;
  2. 导入只发生1次;
  3. import和from是赋值语句,import将模块对象赋值给变量名,from将一或多变量名赋值给另一模块中同名对象;
  4. 修改模块内的变量和模块内变量和现模块变量名冲突时必须使用import导入;

模块命名空间

模块属性可通过__dict__/dir()进行获取。

模块重载(只能用于Python编写模块)

原因:模块在首次导入时加载执行,之后导入不会重新执行文件。

  • reload内置函数;
  • reload处理模块对象;
  • reload位于模块之中,需导入自己;
  1. reload会在模块当前命名空间执行新代码,并对其命名空间进行覆盖;
  2. 文件顶层赋值语句使变量名变为新值;
  3. 重载会影响所有使用import读取了模块的客户端;
  4. 重载只会对以后使用from的客户端造成影响。

模块包导入

import dir1.dir2.mod
from dir1.dir2.mod import x

  1. 模块包的路径包含在sys.path中;
  2. 模块包路径目录下必须包含__init__.py文件(包初始化钩子),容器目录不需要此文件;
  3. 包首次导入时会执行__init__.py文件,用于初始化(__all__可以指定from *导入子模块的名称清单);
  4. import dir1.dir2.mod as mod

相对导入(只适用于包内导入)

相对导入 --- 导入只搜索包的目录,包目录为唯一搜索路径。
绝对导入 --- 导入搜索路径的模块。

  1. 只适用于包内模块文件import导入;
  2. 只是用于from语句;

高级模块话题

  • 模块隐藏数据(_X变量和未包含在模块顶层__all__变量在from *导入时不会导入,但是import仍可访问);
  • 启用实验特性(from feture import featurename);
  • 混合用法模式(namemain,自我测试代码);
  • 修改模块搜索路径(修改sys.path列表,仅在当前Python会话或进程有效);
  • import和from语句as扩展(将模块或模块变量赋值给不同变量名);
  • 使用名称字符串进行导入(exec('import '+ modulename) 或使用内置__import__函数(import(modulename));
  • 过渡性模块重载(重载模块相关子部分);

模块设计理念

  1. 总在Python模块内编码;
  2. 模块耦合降到最低;
  3. 最大化模块黏合度;
  4. 尽量少修改其它模块变量。

模块注意事项

  1. 顶层代码语句次序先后;
  2. from复制变量名;
  3. from * 让变量语义模糊;
  4. reload不会影响之前的from导入;
  5. 递归形式(相互导入的模块调用)的from导入无法工作;

Python模块 --- 最高级别程序组织单元的更多相关文章

  1. [TimLinux] Python 模块

    1. 概念 模块是最高级别的程序组织单元,它将程序文件和数据封装起来以便重用.实际上,模块往往对应Python文件,每一个文件都是一个模块,并且模块导入其他模块之后就可以使用导入模块定义的变量,模块和 ...

  2. 扩展Python模块系列(二)----一个简单的例子

    本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...

  3. 打包发布Python模块或程序,安装包

    Python模块.扩展和应用程序可以按以下几种形式进行打包和发布: python setup.py获取帮助的方式 python setup.py --help python setup.py --he ...

  4. python笔记6 模块与包 程序开发规范 包 re sys time os模块

    模块与包 python 模块首引用加载到内存,如果再次引用此模块,直接从内存中读取. python文件分为:执行文件(解释器运行的文件),被引用文件(import) 模块引用一共发生了3件事: 1.他 ...

  5. python模块部分----模块、包、常用模块

    0.来源:https://www.cnblogs.com/jin-xin/articles/9987155.html 1.导入模块 1.1模块就是一个python文件,模块名是文件名 1.2导入模块的 ...

  6. python模块导入细节

    python模块导入细节 官方手册:https://docs.python.org/3/tutorial/modules.html 可执行文件和模块 python源代码文件按照功能可以分为两种类型: ...

  7. python 模块和包

    一,模块 1,什么是模块? 常见的场景: 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py 的后缀. 但其实 import 加载的模块分为四个通用类别: 1,使用pyt ...

  8. python 模块和包以及他们的导入关系

    一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...

  9. 22 Python 模块与包

    一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...

随机推荐

  1. firefly rk3399 增加 HL-340 驱动(编译内核)

    前言:新下载了firefly rk3399 ubuntu固件16.04,但是发现没有HL-340 USB转串口的驱动,而机器人底盘驱动是HL-340的,所以一直提示无法找到设备驱动. 由于没有技术支持 ...

  2. ECS -------------- 更换系统

    由于是在云服务器上所以更换系统比较简单 1.首先将你运行的实例停止 点击确定 2. 将停止的系统进行更换 确定 点击批量更改 更换需要的系统 点击确定 更换系统输入手机验证码. 更换好了 3.修改远程 ...

  3. crushmap磁盘智能分组

    目录 简介 配置crush class 1. 创建ssd class 2. 创建基于ssd的class rule 3. 创建基于ssd_rule规则的存储池 4. 测试基于ssd的池 简介 ceph从 ...

  4. WPF DataGrid横向显示

    前言 利用各种变换,将其水平改向至横向显示. 注意的是要固定好单元格的高宽,或者手动编写style 否者在滚动的时候,会有高宽比例不一样的时候 再其次,要注意datagrid的容器或者datagrid ...

  5. eclipse中修改项目名

    把项目名springboot-demo改成springboot-rabbitmq 第一步: 选中项目,点击F2,修改项目名第二步: 修改.project文件第三步: 修改.setting/org.ec ...

  6. C# Newtonsoft.Json.JsonReaderException:“Could not convert string to decimal:

    使用Newtonsoft.Json,报以上错误,问题的原因是有"",把“”替换成null: 以前的json: [{"WengvNj":"df5c38c ...

  7. IdentityService4学习笔记之Authorization Code

    前文 本文所有内容来自官方文档,如果有写不明白的地方请下方留言或查看官方文档. 今天介绍Authorization Code模式,适用于保密类型的客户端,保密类型客户端可以理解为在服务器端生成页面(比 ...

  8. webform 的路由

    webform是怎么通过url找到对应handler的呢? mvc 和webapi的路由都是通过注册到RouteTable.Routes中,然后在urlroutingmodule中路由到对应route ...

  9. Java诊断利器Arthas优雅排查生产环境

    前言 Arthas 是Alibaba开源的Java诊断工具.在线排查问题,无需重启:动态跟踪Java代码:实时监控JVM状态.对分秒必争的线上异常,Arthas可帮助我们快速诊断相关问题. 下载安装 ...

  10. 从零开始一步一步搭建Ubuntu Server服务器、修改数据源、安装Docker、配置镜像加速器、Compose部署Gitlab服务

    场景 最终目的是使用Docker Compose部署一个Gitlab服务. 效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序 ...