第12章 模块
1、基本概念
模块的文件名就是模块名字.py
每个模块都定义了自己唯一的名称空间
模块的搜索路径:会被保存在 sys 模块的 sys.path 变量里
>>>sys.path
>>>sys.path.append( …… ) #修改python的搜索路径
>>>sys.path.insert( ... )
2、命名空间
python在执行期间有两个或三个活动的名称空间。分别是:局部名称空间, 全局名称空间和内建名称空间, 但局部名称空间在执行期间是不断变化的, 所以说"两个或三个"。 从名称空间中访问这些名字依赖于它们的加载顺序, 或是系统加载这些名称空间的顺序。
Python 解释器首先加载内建名称空间。 它由 __builtins__ 模块中的名字构成。 随后加载执行模块的全局名称空间, 它会在模块开始执行后变为活动名称空间。
3、导入模块
(1)推荐的import模块的顺序
Python 标准库模块
Python 第三方模块
应用程序自定义模块
(2)from-import语句
在模块里导入指定的模块属性(指定名称):from module import name1[ , name2[,... nameN] ]
(3)扩展的import语句
即指定别名:
import Tkinter as tk
from cgi import FieldStorage as form
(4)被导入到导入者作用域的名字
只从模块导入名字的另一个副作用是那些名字会成为局部名称空间的一部分。 这可能导致覆盖一个已经存在的具有相同名字的对象。 而且对这些变量的改变只影响它的局部拷贝而不是所导入模 块的原始名称空间。 也就是说, 绑定只是局部的而不是整个名称空间。
举例:
############## imptee.py ##############foo = 'abc'def show(): print 'foo from imptee:', foo############## impter.py ##############from imptee import foo, showshow()foo = 123print 'foo from impter:', fooshow()
运行结果是:
foo from imptee: abc
foo from impter: 123 foo from imptee: abc解决办法:
使用 import 和完整的标识符名称(句点属性标识)。
############## impter.py ##############import impteeimptee.show()imptee.foo = 123print 'foo from impter:', imptee.fooimptee.show()
此时的运行结果是:
foo from imptee: abc
foo from impter: 123 foo from imptee: 123注意点:
a 不要滥用 "from module import *"
4、模块内建函数
(1)__import__()
导入模块函数,功能同import语句:
sys = __import__('sys') 功能同 import sys
(2)globals() 和 locals()
分别返回调用者全局和局部名称空间的字典
(3)reload()
重新导入一个已经导入的模块:reload( module )
5、包
包是一个有层次的文件目录结构, 它定义了一个由模块和子包组成的 Python 应用程序执行环境。包可用来解决如下问题:
为平坦的名称空间加入有层次的组织结构
允许程序员把有联系的模块组合到一起 允许分发者使用目录结构而不是一大堆混乱的文件 帮助解决有冲突的模块名称与类和模块相同, 包也使用句点属性标识来访问其元素。用标准的 import 和 from-import 语句导入包中的模块。
(1)目录结构
Phone/
__init__.py
common_util.py
Voicedta/
__init__.py
Pots.py
Isdn.pyFax/
__init__.py
G3.py
Mobile/
__init__.py
Analog.py
igital.py
Pager/
__init__.py
Numeric.py
可以这样导入子包:
import Phone.Mobile.Analog
Phone.Mobile.Analog.dial()也可使用 from-import 实现不同需求的导入:
from Phone import Mobile Mobile.Analog.dial('555-1212')
from Phone.Mobile import Analog Analog.dial('555-1212')
from Phone.Mobile.Analog import dial
dial('555-1212')6、模块的其他特性
自动载入的模块
阻止属性导入
不区分大小的导入
源代码编码
导入循环
模块执行