zoukankan      html  css  js  c++  java
  • 深入理解并使用python的模块与包

    模块

    编写好的一个python文件可以有两种用途:
    1)脚本,一个文件就是整个程序,用来被执行
    2)模块,文件中存放着一堆功能,用来被导入使用

    模块的分类

    1)开发者编写的 .py文件
    2 ) 由C或C++编译的共享库或DLL
    3 ) 包
    4 ) 内置模块

    模块的查找顺序
    1)内存中已经加载的模块(防止重复加载)
    2 ) 内置模块(所以说自定义模块不应该和系统模块同名)
    3 )sys.path路径中包含的模块

    额外知识:sys.path初始化顺序
    1 )执行文件所在的当前目录
    2 )PTYHONPATH(包含一系列目录名,与shell变量PATH语法一样)
    3 )依赖安装时默认指定的

    模块的使用
    使用前必知
    1)不管程序走到哪个模块的哪一步,程序只认程序启动的路径文件夹。
    2)重导入只会增加模块的引用
    具体地说,第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句
    额外功能
    1)用于测试环境的模块重导入:import importlib     importlib.reload(aa)
    2 ) 为模块名起别名 import spam as sm ,这种做法常用于统一接口名一样的模块
    3 ) 限制模块导入的名字
      在spam.py中新增一行,__all__=['money','read1'] #这样在另外一个文件中用from spam import *就这能导入列表中规定的两个名字

    扩展知识:提高模块加载速度的.pyc文件
    pyc文件(字节码文件)也可以被python解释器执行,其功能主要是提高加载模块的速度。
    注意的是:从.pyc文件中读指令来执行不会比从.py文件中读指令执行更快,只有在模块被加载时,.pyc文件才是更快的

    pyc文件怎样产生?
    python解释器会在__pycache__目录中下缓存每个模块编译后的版本,
    格式为:module.version.pyc。通常会包含python的版本号。例如,在CPython3.3版本下,spam.py模块会被缓存成__pycache__/spam.cpython-33.pyc。
    这种命名规范保证了编译后的结果多版本共存。Python检查源文件的修改时间与编译的版本进行对比,如果过期就需要重新编译。这是完全自动的过程。
    由于编译的模块是平台独立的,所以相同的库可以在不同的架构的系统之间共享。 使得pyc成为一种跨平台的字节码,是由python虚拟机来执行的,
    但是pyc的内容跟python的版本相关,不同的版本编译后的pyc文件不同,2.5编译的pyc文件不能到3.5上执行,
    并且pyc文件是可以反编译的,因而它的出现仅仅是用来提升模块的加载速度的,不是用来加密的。

    注意:python解释器在以下两种情况下不检测缓存
    1) 如果是在命令行中被直接导入模块,则按照这种方式,每次导入都会重新编译,并且不会存储编译后的结果
    2 )  如果源文件不存在,那么缓存的结果也不会被使用,如果想在没有源文件的情况下来使用编译后的结果,则编译后的结果必须在源目录下



    包就是一个包含有__init__.py文件的文件夹,所以其实我们创建包就是为了将模块组织起来。创建包的目的是为了被导入使用。
    注意: 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错
    包的使用
    使用前必知
    1)导入包本质就是在导入包的包下的__init__.py, 产生的名称空间的名字同样来源于文件
    2)单独导入包名称时不会导入包中所有包含的所有子模块。from glance.api import *,实际上该语句只会导入包api下__init__.py文件中定义的名字
      若想仅仅导入包,就使用包.包.模块形式,例如:import glance.db.models
      或者在__init__.py上面下功夫。

    例如:
    #glance/__init__.py
    from . import cmd

    #glance/cmd/__init__.py
    from . import manage

    3) from后import导入的模块,必须是明确的是被导入的右边不能带点,否则会有语法错误,如:from a import b.c是错误语法
    4 )  '.','..'这些相对路径符,只能用于连接包内的模块用的,
      换句话说,存在相对模块引块只是为了被另外的模块引用而存在,永远不能当做入口。而入口处的路径必定是绝对路径

     

  • 相关阅读:
    2018/2/26 省选模拟赛 0分
    2018/2/25 省选模拟赛 36分
    BZOJ 2428 JZYZOJ1533 : [HAOI2006]均分数据 模拟退火 随机化
    BZOJ 4036: [HAOI2015]按位或 集合幂函数 莫比乌斯变换 莫比乌斯反演
    BZOJ 3196 Tyvj 1730 二逼平衡树 树套树 线段树 treap
    POJ 2728 JZYZOJ 1636 分数规划 最小生成树 二分 prim
    JZYZOJ1998 [bzoj3223] 文艺平衡树 splay 平衡树
    POJ 3974 Palindrome 字符串 Manacher算法
    BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元
    jQuery cookie使用
  • 原文地址:https://www.cnblogs.com/ziyide/p/9096084.html
Copyright © 2011-2022 走看看