Python学习手册(第五部分)
Posted xhjh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习手册(第五部分)相关的知识,希望对你有一定的参考价值。
第21章 模块:宏伟蓝图
import:使客户端(导入者)以一个整体获取一个模块
from:允许客户端从一个模块文件中获取特定的变量名
imp.reload:在不中止程序的情况下,提供了一种重新载入模块文件代码的方法。
import如何工作
- 找到模块文件
- 编译成位码
- 执行模块的代码来创建其所定义的对象
模块搜索路径(sys.path)
- 程序的主目录
- PYTHONPATH目录
- 标准链接库目录
- 任何.pth文件的内容
第22章 模块代码编写基础
- import会读取整个模块,from将获取(或者是复制)模块特定的变量名。import和from是可执行的语句,而不是编译期间恶声明,他们可以嵌套在其他语句中。
- 模块的命名空间能通过属性__dict__或dir(M)获取。
reload
- reload是python中的内置函数而不是语句
- 传给reload的是已经存在的模块对象,而不是变量名
- reload在python3.0中位于模块之中,并且必须导入自己
第23章 模块包
包导入基础
import dir1.dir2.mod
from dir1.dir2.mod import x
- 如果选择使用包导入,必须遵循:包导入语句的路径中的每个目录内都必须有__init__.py文件,否则导入包会失败。例如上面的dir1和dir2中都必须包含一个__init__.py文件。__init__.py文件可以包含python程序代码,也可以是空的。python首次导入某个目录时,会自动执行该目录下的__init__.py文件中的所有程序代码。
- 可以在__init__.py文件内使用__all__列表来定义目录以from 语句形式导入时,需要导出什么。在__init__.py文件中,__all__列表是指包(目录)名称使用from 的时候,应该导入的子模块的名称清单。如果没有设定__all__,from *语句不会自动加载嵌套于该目录的子模块。
- 任何导入的目录也可以传递给reload,来强制该项目重新执行。
- 可以使用from语句前面的点号来表示,导入应该相对于外围 包——这样的导入将只在包的内部搜索,并且不会搜索位于导入搜索路径(sys.path)上的某处的同名模块,直接效果是包模块覆盖了外部的模块。
- 在python2.6中,包的代码中的常规导入(没有前面的点号),目前默认为一种先相对再绝对的搜索路径顺序,也就是说,首先搜索包自己的路径,然而,在python3.0中,在一个包中导入默认是绝对的——在缺少任何特殊的点语法的时候,导入忽略了包好包自身并在sys.path搜索路径上的某处查找。
from . import spam #导入位于当前文件所在目录的模块spam
from .spam import name #从名为spam的模块导入变量name
from .. import spam #从当前包的父目录的相对导入
#例如位于某个模块A.B.C中的代码做如下导入
from . import D #import A.B.D
from .. import E #import A.E
from .D import X #import A.B.D.X
from ..E import X #import A.E.X
第24章 高级模块话题
在模块中隐藏数据
- 将下划线放在变量名前面(如:X),可以防止客户端使from *语句导入模块名时,把其中的那些变量名复制出去。也可以在模块顶层将变量名的字符串列表赋值给变量__all_,以达到类似与X命名惯例的隐藏效果。例如:__all_ = [“Error”,”encode”,”decode”],from 语句只会将列在__all__列表中的变量名复制出来。python会先寻找模块内的__all__列表,如果没有定义的话,from 就会复制出开头没有单下划线的所有变量名。
- 如果文件是以顶层程序文件执行,在启动时,__name__就会设置为字符串”__main__”。如果文件被导入,__name__就会改设成客户端所了解的模块名。因此可以通过检查__name__来确定模块是在执行还是在导入。
- import和from与语句的扩展
import modulename as name
from modulename import attrname as name
4. 模块是对象:元程序,获取M模块内名为name的属性的方法有:可以使用结合点号运算,或者对模块的属性字典进行索引运算(在内置\\__dict__属性中显示),python也在sys.modules字典中导出所有已加载的模块的列表,并提供内置函数getattr以字符串名来取出属性。
M.name
M.__dict__['name']
sys.modules['M'].name
getattr(M,'name')
5. 用名称字符串导入模块:可以将导入语句构建成一个字符串传递给exec内置函数进行导入,也可以将要导入的模块名称字符串传递给内置的\\__import__函数进行导入。
6. 在导入时,模块文件顶层的程序代码(不在函数内)一旦python运行到时,就会立即执行,因此,该语句是无法引用文件后面位置赋值的变量名。位于函数主体内的代码直到函数被调用后才会运行,因为函数内的变量名在函数实际执行前都不会解析,通常可以引用文件内任意地方的变量。
以上是关于Python学习手册(第五部分)的主要内容,如果未能解决你的问题,请参考以下文章