zoukankan      html  css  js  c++  java
  • Python模块 --- 最高级别程序组织单元

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

    《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导入无法工作;
  • 相关阅读:
    Django之Admin
    反射功能:***attr
    python单例模式
    三元表达式,推导式,生成器表达式
    jquery的each()
    Django篇之F,Q
    Django的思维导图
    Models_Class 有choice,如何显示其中文
    Java并发机制(1)--线程状态与方法(转)
    Java并发机制(2)--synchronized与Lock
  • 原文地址:https://www.cnblogs.com/li1234yun/p/7812019.html
Copyright © 2011-2022 走看看