第 8 章: 模块, 包与分发---Word
Posted 在这里, 意淫和实干都值得尊重
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第 8 章: 模块, 包与分发---Word相关的知识,希望对你有一定的参考价值。
第八章: 模块, 包 与 分发
描述:
大型Python程序以模块和包的形式组织。另外,Python标准库中包含大量模块。本章详细介绍模块和包系统。还将提供有关如何安装第三方模块和分发源代码的信息。
8.1模块与import语句
任何Python源文件都能以模块的形式使用。例如,考虑以下代码:
# spam.py a = 37 def foo (): print("I\'m foo and a is Is" % a) def bar(): print("I\'m bar and I\'m calling foo") foo() class Spam(object): def grok(self): print ("I\'m Spam. grok")
要以模块的形式加载这段代码,可以使用import spam语句。
首次使用import加载模块时,它将做3件事:
(1) 创建新的命名空间,用作在相应源文件中定义的所有对象的容器。在模块中定义的函数和方法在使用global语句时将访问该命名空间。
(2) 在新创建的命名空间中执行模块中包含的代码。
(3) 在调用函数中创建名称来引用模块命名空间。这个名称与模块的名称相匹配,按如下方式使用:
需要强调的是,import 执行已加载源的文件中的所有语句。如果模块执行计算或生成了除定义变量、函数和类以外的输出,就可以看到生成的这些结果。
而且,一个容易混淆的模块问题就是对类的访问。请记住,如果文件 spam.py 定义了类Spam,必须使用名称spam.Spam来引用该类。
要导入多个模块,可以为import提供逗号分隔的模块名称列表
ex:
import socket, os, re
限定符
用于引用模块的名称可以使用as限定符进行更改,例如:
import spam as sp import socket as net sp.foo() sp.bar() net.gethostname()
使用其他的名称加载模块时,新名称仅应用于出现了import语句的源文件或上下文。其他程序模块仍然可以使用模块原来的名称加载它。
更改已导入模块的名称对于编写可扩展的代码很有用。
例如,设想有两个模块xmlreader.py和 csvreader.py,它们都定义了函数read_data(filename),作用是从文件中读取一些数据,但采用不同的输入格式,可以编写代码来选择性地挑选读取模块,
例如:
if format == \'xml\': import xmlreader as reader elif format == \'csv\': import csvreader as reader data = reader.read_data(filename)
模块是Python中的第一类对象。
也就是说它们可以分配给变量,放置在列表等数据结构中,以及以数据的形式在程序中传递。
例如,上一个例子中的reader变量只用于引用相应的模块对象。
在后台, 模块对象是位于字典之上的一层,这个字典用于持有模块命名空间的内容。
这个字典以模块的形式使用,并且只要査找或更改模块中的值,就会对该字典进行相应操作。
import语句可以出现在程序中的任何位置。
但是,每个模块中的代码仅加载和执行一次,无论 import语句被使用了多少次。后续的import语句仅将模块名称绑定到前一次导入所创建的模块对象。
你可以找到一个字典,其中包含变量sys.modules中所有当前加载的模块。该字典将模块名称映射到模块对象。该字典的内容用于确定import是否加载模块的全新拷贝。
8.2从模块导入选定符号
from语句用于将模块中的具体定义加载到当前命名空间中。
from语句相当于import,但它不会创建一个名称来引用新创建的模块命名空间,而是将对模块中定义的一个或多个对象的引用放到当前命名空间中:
from spam import foo #导入spam并将foo放在当前命名空间中 foo() # 调用spam.foo() spam.foo() # NameError: spam
from语句还会接受用逗号分隔的对象名称列表。
例如:
1 | from spam import foo, bar |
如果要导入一个极长的名称列表,可以将名称放在括号中。这样可以轻松地将import语句放在多行上,
例如:
1 2 3 | from spam import (foo, bar, Spam) |
另外, as限定符可用于重命名使用from导入的具体对象,
第8章 模块