
1.7.2 模块
在Python中,一个以“.py”为后缀名的文件便是一个模块,每个模块在Python里都被看作一个独立的文件。模块可以被项目中的其他模块、一些脚本甚至是交互式的解析器使用,也可以被其他程序引用,以便使用该模块里的函数等功能。Python中的标准库也是通过这种方法来使用的。
1.Python中模块的分类
1)系统内置模块,例如sys、time、json等模块。
2)自定义模块,即编程者自己写的模块,对某段逻辑或某些函数进行封装后可供其他函数调用。
注意 自定义模块的命名不能和系统内置的模块重名,否则将不能再导入系统的内置模块了。例如,自定义一个sys.py模块后,便无法使用系统的sys模块了。
3)第三方的开源模块,这部分模块具有开源的代码,可以通过pip install进行安装。
2.模块的引入
模块定义好后,我们可以使用import语句来引入模块,语法如下:
import module1[, module2[,... moduleN]]
比如要引用模块math,就可以在文件最开始的地方用import math来实现。在调用math模块中的函数时,必须这样引用:模块名.函数名。
【例1-64】模块的定义
def print_func(par): print "Hello: ", par return
下例是一个简单的模块support.py。
【例1-65】引入模块并调用其中的函数
#!/usr/bin/python # 导入模块 import support # 现在可以调用模块里包含的函数了 support.print_func("Runoob")
以上实例的输出结果为:
Hello: Runoob
当解释器遇到import语句时,如果模块位于当前的搜索路径,则会被导入。搜索路径是解释器先搜索所有目录的列表。如想要导入模块support.py,则需要把命令放在脚本的顶端。无论执行了多少次import,一个模块只会被导入一次,这样可以防止导入模块的操作被一遍又一遍地执行。
【例1-66】引入模块后起别名
# 导入模块 import support as su print(su.print_func("Runoob"))
以上实例的输出结果为:
Hello: Runoob
3.from...import语句
Python的from语句让你从模块中导入一个指定的部分到当前命名空间。
【例1-67】from...import语句
from modname import name1[, name2[, ... nameN]]
例如,要导入模块fib的fibonacci函数,可使用如下语句:
from fib import fibonacci
这个声明不会把整个fib模块导入当前的命名空间中,它只会将fib里的fibonacci单独引入执行这个声明的模块的全局符号表。
4.from...import*语句
from...import*语句可以把一个模块的所有内容全都导入当前的命名空间。
【例1-68】from...import*语句
from modname import *
这提供了一个简单的方法来导入一个模块中的所有项目,但不推荐过多地使用。
【例1-69】一次性引入math模块中所有的东西
from math import *
5.模块的属性
一个模块被另一个程序第一次引入时,其主程序将运行。如果我们希望在模块被引入时不执行模块中的某一程序块,那么我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。
【例1-70】用__name__属性来使该程序块仅在该模块自身运行时执行
# Filename: using_name.py if __name__ == '__main__': print('程序自身在运行') else: print('我来自另一模块')
运行输出如下:
python using_name.py 程序自身在运行 python import using_name 我来自另一模块
说明 每个模块都有一个__name__属性,当其值是'__main__'时,表明该模块自身在运行,否则是被引入。
内置的函数dir()可以找到模块内定义的所有名称,以字符串列表的形式返回。
【例1-71】编写函数dir()
a = [1, 2, 3, 4, 5] import fibo fib = fibo.fib dir() # 得到一个当前模块中定义的属性列表 ['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys'] a = 5 # 建立一个新的变量a dir() ['__builtins__', '__doc__', '__name__', 'a', 'sys'] del a # 删除变量名a dir() ['__builtins__', '__doc__', '__name__', 'sys']