Python网络爬虫技术与实战
上QQ阅读APP看书,第一时间看更新

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']