第 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章 模块

RTX基础教程目录

第8章 装饰器模块和包

广东海洋大学 电子1151 孔yanfei python语言程序设计 第八周

第1章 并发编程的挑战

第8章 数据库后台编程技术