9.2. 包

实际上解析一个 XML 文档是很简单的:只要一行代码。但是,在你接触那行代码前,需要暂时岔开一下,讨论一下包。

例 9.5. 载入一个 XML 文档 (偷瞥一下)

>>> from xml.dom import minidom 
>>> xmldoc = minidom.parse('~/diveintopython/common/py/kgp/binary.xml')
这个语法你之前没有见过。它看上去很像我们熟知的 from module import,但是"." 使得它好像不只是普通的 import 那么简单。事实上,xml 称为包,domxml 中嵌套的包,而 minidomxml.dom 中的模块。

听起来挺复杂的,其实不是。看一下确切的实现可能会有帮助。包不过是模块的目录;嵌套包是子目录。一个包 (或一个嵌套包) 中的模块也只是 .py 文件罢了,永远都是,只是它们是在一个子目录中,而不是在你的 Python 安装环境的主 lib/ 目录下。

例 9.6. 包的文件布局

Python21/           Python 安装根目录 (可执行文件的所在地)
|
+--lib/             库目录 (标准库模块的所在地)
   |
   +-- xml/         xml包 (实际上目录中还有其它东西)
       |
       +--sax/      xml.sax包 (也只是一个目录)
       |
       +--dom/      xml.dom包 (包含 minidom.py)
       |
       +--parsers/  xml.parsers包 (内部使用)

所以你说 from xml.dom import minidomPython 认为它的意思是“xml 目录中查找 dom 目录,然后在这个目录 中查找 minidom 模块,接着导入它并以 minidom 命名 ”。但是 Python 更聪明;你不仅可以导入包含在一个包中的所有模块,还可以从包的模块中有选择地导入指定的类或者函数。语法都是一样的; Python 会根据包的布局理解你的意思,然后自动进行正确的导入。

例 9.7. 包也是模块

>>> from xml.dom import minidom         
>>> minidom
<module 'xml.dom.minidom' from 'C:\Python21\lib\xml\dom\minidom.pyc'>
>>> minidom.Element
<class xml.dom.minidom.Element at 01095744>
>>> from xml.dom.minidom import Element 
>>> Element
<class xml.dom.minidom.Element at 01095744>
>>> minidom.Element
<class xml.dom.minidom.Element at 01095744>
>>> from xml import dom                 
>>> dom
<module 'xml.dom' from 'C:\Python21\lib\xml\dom\__init__.pyc'>
>>> import xml                          
>>> xml
<module 'xml' from 'C:\Python21\lib\xml\__init__.pyc'>
这里你正从一个嵌套包 (xml.dom)中导入一个模块 (minidom)。结果就是 minidom 被导入到了你 (程序) 的命名空间中了。要引用 minidom 模块中的类 (比如 Element),时时彩计划软件公式:你必须在它们的类名前面加上模块名。
这里你正从一个来自嵌套包 (xml.dom) 的模块 (minidom) 中导入一个类 (Element)。结果就是 Element 直接导入到了你 (程序) 的命名空间中。注意,这样做并不会干扰以前的导入;现在 Element 类可以用两种方式引用了 (但其实是同一个类)。
这里你正在导入 dom 包 (xml 的一个嵌套包),并将其作为一个模块。一个包的任何层次都可以视为一个模块,一会儿就会看到。它甚至可以拥有自己的属性和方法,就像你在前面看到过的模块。
这里你正在将根层次的 xml 包作为一个模块导入。

那么如何才能导入一个包 (它不过是磁盘上的一个目录) 并使其成为一个模块 (它总是在磁盘上的一个文件) 呢?答案就是神奇的 __init__.py 文件。你明白了吧,包不只是目录,它们是包含一个特殊文件 __init__.py 的目录。这个文件定义了包的属性和方法。例如,xml.dom 包含了 Node 类,它在xml/dom/__init__.py中有所定义。当你将一个包作为模块导入 (比如从 xml 导入 dom) 的时候,实际上导入了它的 __init__.py 文件。

一个包是一个其中带有特殊文件 __init__.py 的目录。__init__.py 文件定义了包的属性和方法。其实它可以什么也不定义;可以只是一个空文件,但是必须要存在。如果 __init__.py 不存在,这个目录就仅仅是一个目录,而不是一个包,它就不能被导入或者包含其它的模块和嵌套包。

那为什么非得用包呢?嗯,它们提供了在逻辑上将相关模块归为一组的方法。不使用其中带有 saxdomxml 包,作者也可以选择将所有的 sax 功能放入 xmlsax.py中,并将所有的 dom 功能放入 xmldom.py中,或者干脆将所有东西放入单个模块中。但是这样可能不实用 (写到这儿时,XML 包已经超过了 3000 行代码) 并且很难管理 (独立的源文件意味着多个人可以同时在不同的地方进行开发)。

如果你发现自己正在用 Python 编写一个大型的子系统 (或者,很有可能,当你意识到你的小型子系统已经成长为一个大型子系统时),你应该花费些时间设计一个好的包架构。它是 Python 所擅长的事情之一,所以应该好好利用它。

时时彩技巧软件 时时彩平台网站 时时彩和值技巧 易位时时彩软件用不了 时时彩玩法上全狐网
彩专家时时彩人工计划 谁有信誉好的网投平台 时时彩系统出租 内蒙福彩快三开奖结果 java时时彩
江西时时彩追号技巧 3d时时彩数字出号规 天天时时彩助手 新疆福利时时彩 现金盘时时彩平台出租
少女时时彩计划软件 江西时时彩网址 极彩娱乐平台登录 江西时时彩计划后一 时时彩网站一条龙7xwl
北京pk拾开奖视频直播 急速赛车开奖结果 北京快3公交路线 河南快3开奖结果一定牛 燕赵风采排列7 开奖
吉祥坊 天津11选5开奖天津体彩网 真人棋牌斗牛 河南11选5基本走势图 pc蛋蛋幸运28特码预测
辽宁十一选五帮助 如意娱乐城 掌上彩票 老梁故事会 天津11选5选号方法99法
贵州快3一定♂贵州快3近10期开奖号码分布♂11选5开奖结果 福建11选五走势图 合乐分分彩自动 真钱棋牌斗牛 时时彩走势图