模块与包

一、什么是模块?

  模块是一系列功能的集合体。

模块和文件:

  模块的文件名就是模块的名字加上扩展名.py

一个moudle.py文件就是一个模块,文件名是moudle.py,模块名是moudle
#常见的场景:一个模块就是一个包含了一组功能的python文件,比如spam.py,模块名为spam,可以通过import spam使用。
#在python中,模块的使用方式都是一样的,但其实细说的话,模块可以分为四个通用类别: 
1 使用python编写的.py文件
2 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
3 已被编译为共享库或DLL的C或C++扩展
4 使用C编写并链接到python解释器的内置模块

  在python中导入的是模块或模块属性。

二、为什么要用模块?

#1、从文件级别组织程序,更方便管理
随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。
这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用
#2、拿来主义,提升开发效率 同样的原理,我们也可以下载别人写好的模块然后导入到自己的项目中使用,这种拿来主义,可以极大地提升我们的开发效率 #ps: 如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,
需要时就通过python test.py方式去执行,此时test.py被称为脚本script。

三、如何用模块?(大前提模块是被执行文件导入使用,模块的导入必须搞明白谁是执行文件谁是被导入的模块。)

  1. 导入模块的方式之一:import 模块名
  2. 导入模块的方式之二:from 模块名 import 具体的功能

名称空间

  名称空间是名称(标识符)到对象的映射。

名称空间与变量作用域比较:

名称查找、确定作用域、覆盖:

import首次导入模块发生的三件事:

第一件:以模块为准创建一个模块名称空间

第二件:执行模块对应的文件,将执行过程中产生的名字丢到模块名称空间里

第三件:在当前执行文件名称空间拿到一个模块名,该模块名是指向模块的名称空间的。

from...import...首次导入模块发生的三件事:

第一件:以模块为准创建一个模块名称空间

第二件:执行模块对应的文件,将执行过程中产生的名字丢到模块名称空间里

第三件:在当前执行文件名称空间中拿到一个属性(功能)名字,该名字直接指向模块中的某一个属性(功能)名字,意味着可以不用加任何前缀可以直接使用。

两种导入模块方式的总结:

1、from...import...导入模块比import导入模块的优缺点:

优点:不用加前缀,代码更为简单

缺点:容易与当前执行文件中名称空间中的名字冲突。 

相同点:

1、都会执行模块对应的文件,都会产生模块名称空间。

2、调用功能时,需要跑到定义时寻找作用域关系,与调用位置无关。 

不同点:

1、一种需要加前缀一种不需要。

模块的搜索路径和路径搜索

模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块。

#模块的查找顺序
1、在第一次导入某个模块时(比如spam),会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用
    ps:python解释器在启动时会自动加载一些模块到内存中,可以使用sys.modules查看
2、如果没有,解释器则会查找同名的内建模块
3、如果还没有找到就从sys.path给出的目录列表中依次寻找spam.py文件。


#sys.path的初始化的值来自于:
The directory containing the input script (or the current directory when no file is specified).
PYTHONPATH (a list of directory names, with the same syntax as the shell variable PATH).
The installation-dependent default.

#需要特别注意的是:我们自定义的模块名不应该与系统内置模块重名。虽然每次都说,但是仍然会有人不停的犯错。 

#在初始化后,python程序可以修改sys.path,路径放到前面的优先于标准库被加载。
1 >>> import sys
2 >>> sys.path.append('/a/b/c/d')
3 >>> sys.path.insert(0,'/x/y/z') #排在前的目录,优先被搜索
注意:搜索时按照sys.path中从左到右的顺序查找,位于前的优先被查找,sys.path中还可能包含.zip归档文件和.egg文件,python会把.zip归档文件当成一个目录去处理,

#首先制作归档文件:zip module.zip foo.py bar.py 
import sys
sys.path.append('module.zip')
import foo,bar

#也可以使用zip中目录结构的具体位置
sys.path.append('module.zip/lib/python')


#windows下的路径不加r开头,会语法错误
sys.path.insert(0,r'C:UsersAdministratorPycharmProjectsa')
 

#至于.egg文件是由setuptools创建的包,这是按照第三方python库和扩展时使用的一种常见格式,.egg文件实际上只是添加了额外元数据(如版本号,依赖项等)的.zip文件。

#需要强调的一点是:只能从.zip文件中导入.py,.pyc等文件。使用C编写的共享库和扩展块无法直接从.zip文件中加载(此时setuptools等打包系统有时能提供一种规避方法),且从.zip中加载文件不会创建.pyc或者.pyo文件,因此一定要事先创建他们,来避免加载模块是性能下降。

包介绍

 张仁国

原文地址:https://www.cnblogs.com/zhangrenguo/p/9774237.html