您的位置:首页 > 编程语言 > Python开发

Python核心编程笔记 - 第12章 模块

2015-09-30 22:33 507 查看

Chapter 12. 模块

模块和文件

一个文件被看作是一个独立的模块,一个模块也可以被看作是一个文件。

模块的导入需要一个叫做“路径搜索”的过程。默认的搜索路径是在编译或者安装的时候指定的。它可以在2个地方修改。

1. 启动Python解释器之前,修改PYTHONPATH环境变量。该变量内容是一组用冒号分割的目录路径。

2. 启动Python解释器之后,可以修改sys.path的内容。sys.path是一个列表,调用append方法添加新路径即可。

使用sys.modules可以找到当前导入了哪些模块和它们来自何处。sys.modules是一个字典,key为模块名,value为对应的物理地址。

名称空间

在执行期间,有3个active的名称空间 - local的名称空间,global的名称空间, 和build-in的名称空间。

Python解释器首先加载内建名称空间,它由builtins模块中的名字构成;随后加载执行模块的全局名称空间,它在模块开始执行后变为active的名称空间。

__builtins__ 和 __builtin__:

- __builtins__ 包含内建名称空间中内建名字的集合,其中大多数来自__builtin__ 模块

- __builtin__ 包含内建内建函数、异常和其他属性

模块导入的特性

加载模块会导致这个模块被执行。也就是被导入模块的顶层代码将直接被执行。 这通常包括设定全局变量以及类和函数的声明。如果有检查__name__的操作,它也会被执行。

导入(import)和加载(load):一个模块只被加载一次,无论它被导入多少次。

Python具有从zip文件导入模块的功能。导入时,会把zip文件当作一个目录来处理。

如果要导入的一个zip文件中只包含.py文件,那么Python不会为其添加pyc文件,这意味着一个zip文件内没有匹配的pyc文件时,导入速度要慢一些。

在全局名称空间下,globals()和locals()返回相同的字典,因为此时的局部名称空间就是全局空间。

def foo():
print '\ncalling foo()...'
aString = 'bar'
anInt = 42
print "foo()'s globals:", globals().keys()
print "foo()'s locals:", locals().keys()

print "__main__'s globals", globals().keys()
print "__main__'s locals", locals().keys()
foo()


执行结果如下:

$namespace.py
__main__'s globals: ['__doc__', 'foo', '__name__', '__builtins__']
__main__'s locals: ['__doc__', 'foo', '__name__', '__builtins__']
calling foo()...
foo()'s globals: ['__doc__', 'foo', '__name__', '__builtins__']
foo()'s locals: ['anInt', 'aString']


reload()内建函数可以重新导入一个已经被导入的模块。语法如下:

reload(module)


使用reload()的时候有一些标准:首先模块必须是全部导入(不是使用from-import),而且它必须被全部导入。

另外reload()的参数必须是模块自身,而不是一个字符串。比如,是reload(sys),而不是reload(‘sys’).

包(package)

package是一个有层次的文件目录结构,它定义了一个由模块和子package组成的Python应用程序执行环境。

绝对导入和相对导入:

下边的代码只能工作在旧版本的Python下,在新版本中它会引起一个警告,或者干脆不能工作。

import Analog
from Analog import dial


以上是绝对导入的限制造成的。下边是一些可行的导入方法:

from Phone.Mobile.Analog import dial
from .Analog import dial
from ..common_util import setup
from ..Fax import G3.dial


模块的其他属性

如果不想让某个模块属性被”from module import *”导入,可以给不想被导入的属性名称前面加上一个下划线”_”.

循环导入:

A要导入B,而在B中的某处也需要从A导入的一些属性或函数。

解决办法:

遇到此种情况,不要把import语句写在文件的开头,而是写在需要它的地方。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: