Python学习手册(第五部分)

第21章 模块:宏伟蓝图
import:使客户端(导入者)以一个整体获取一个模块
from:允许客户端从一个模块文件中获取特定的变量名
imp.reload:在不中止程序的情况下,提供了一种重新载入模块文件代码的方法。

import如何工作

  1. 找到模块文件
  2. 编译成位码
  3. 执行模块的代码来创建其所定义的对象

模块搜索路径(sys.path)

  1. 程序的主目录
  2. PYTHONPATH目录
  3. 标准链接库目录
  4. 任何.pth文件的内容

第22章 模块代码编写基础

  1. import会读取整个模块,from将获取(或者是复制)模块特定的变量名。import和from是可执行的语句,而不是编译期间恶声明,他们可以嵌套在其他语句中。
  2. 模块的命名空间能通过属性__dict__或dir(M)获取。

reload

  1. reload是python中的内置函数而不是语句
  2. 传给reload的是已经存在的模块对象,而不是变量名
  3. reload在python3.0中位于模块之中,并且必须导入自己

第23章 模块包
包导入基础
import dir1.dir2.mod
from dir1.dir2.mod import x

  1. 如果选择使用包导入,必须遵循:包导入语句的路径中的每个目录内都必须有__init__.py文件,否则导入包会失败。例如上面的dir1和dir2中都必须包含一个__init__.py文件。__init__.py文件可以包含python程序代码,也可以是空的。python首次导入某个目录时,会自动执行该目录下的__init__.py文件中的所有程序代码。
  2. 可以在__init__.py文件内使用__all__列表来定义目录以from 语句形式导入时,需要导出什么。在__init__.py文件中,__all__列表是指包(目录)名称使用from 的时候,应该导入的子模块的名称清单。如果没有设定__all__,from *语句不会自动加载嵌套于该目录的子模块。
  3. 任何导入的目录也可以传递给reload,来强制该项目重新执行。
  4. 可以使用from语句前面的点号来表示,导入应该相对于外围 包——这样的导入将只在包的内部搜索,并且不会搜索位于导入搜索路径(sys.path)上的某处的同名模块,直接效果是包模块覆盖了外部的模块。
  5. 在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章 高级模块话题
在模块中隐藏数据

  1. 将下划线放在变量名前面(如:X),可以防止客户端使from *语句导入模块名时,把其中的那些变量名复制出去。也可以在模块顶层将变量名的字符串列表赋值给变量__all_,以达到类似与X命名惯例的隐藏效果。例如:__all_ = [“Error”,”encode”,”decode”],from 语句只会将列在__all__列表中的变量名复制出来。python会先寻找模块内的__all__列表,如果没有定义的话,from 就会复制出开头没有单下划线的所有变量名。
  2. 如果文件是以顶层程序文件执行,在启动时,__name__就会设置为字符串”__main__”。如果文件被导入,__name__就会改设成客户端所了解的模块名。因此可以通过检查__name__来确定模块是在执行还是在导入。
  3. 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运行到时,就会立即执行,因此,该语句是无法引用文件后面位置赋值的变量名。位于函数主体内的代码直到函数被调用后才会运行,因为函数内的变量名在函数实际执行前都不会解析,通常可以引用文件内任意地方的变量。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值