Learning Python Part III 之 模块的使用

先简单创建一个模块文件作为例子:

#module1.py
def printer(x):
    print(x)

import 语句

>>> import module1
>>> module1.printer('Hello world!')
Hello world!

from 语句

因为from直接从一个文件中拷贝一个特定的名字到其它作用域,它允许我们在代码中直接使用拷贝的名字而不需要通过模块:

>>> from module1 import printer
>>> printer('Hello world!')
Hello world!

from的格式允许我们拷贝多个名字,中间用逗号隔开。这个和import有同样的效果,不过因为被导入的名字被拷贝进了from语句出现的作用域里,使用这样的变量名不需要打太多字——我们可以直接只用而不是通过模块导入。事实上,from并不会赋值模块本身的名字。
正如之前的细节,from语句只是import语句的扩展——它需要导入整个文件,进行三步操作,但是有额外的一步,就是复制出一个或多个名字(不是对象)。尽管加载了整个模块,但可以更直接的访问其中的名字。

from * 语句

在from语句中当我们使用*而不是特定的名字,我们会得到被引用模块中的所有名字,和from一样,我们可以在代码中直接使用printer:

>>> from module1 import *
>>> printer('Hello world!')
Hello world!

Import只发生一次

当人们开始使用模块之后问的最多的问题之一就是“为什么我的Import不能正常工作,他们经常报告说第一次Import 运行的很好,但是之后在同一过程中的运行并不是很有效。下面就是原因:
模块会在第一次import 或者from时被加载和运行,并且仅这一次。这是有原因的——因为import是一个很昂贵的操作,Python默认每个文件每个进程只会运行一次,之后的引用操作只会去匹配已经加载的模块对象。

初始化代码

因为一个模块文件中的代码通常只会执行一次,你可以用它来初始化变量,例如:

#simple.py
print('hello')
spam = 1

在这个例子中,print和=在模块第一次被导入的时候被执行,变量spam是在导入时被初始化的:

% python
>>> import simple
hello
>>> simple.spam
1

第二次和之后的导入并不会重新运行模块的代码,它仅仅从Python内部的模块表匹配已经创立的模块对象。因此,变量spam不能被重新初始化:

>>> simple.spam = 2
>>> import simple
>>> simple.spam
2

当然,有时候你希望在后续的引用中重新运行模块代码,这就需要用到Python的reload函数。

import和from是赋值

就像def,import和from是可执行的语句,不是编译声明。他们可以被嵌套在if结构中,在不同的操作中选择;出现在def里,只在被调用的时候加载;在try语句块里使用,提供默认选项;等等。当程序运行时,只有当Python到达它们的时候才会被运行。换句话说,只有当相关的import和from语句运行到的时候被引用的模块和名字才可用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章