Python模块和包
1、什么是模块:
Python 标准库中包含了大量的模块(称为标准模块),还有大量的第三方模块,开发者自己也可以开发自定义模块。通过这些强大的模块可以极大地提高开发者的开发效率。
模块就是 Python 程序。
模块可以比作一盒积木,通过它可以拼出多种主题的玩具,这与前面介绍的函数不同,一个函数仅相当于一块积木,而一个模块(.py 文件)中可以包含多个函数,也就是很多积木。
- 随着程序功能的复杂,程序体积会不断变大,为了便于维护,通常会将其分为多个文件(模块),这样不仅可以提高代码的可维护性,还可以提高代码的可重用性。
代码的可重用性体现在,当编写好一个模块后,只要编程过程中需要用到该模块中的某个功能(由变量、函数、类实现),无需做重复性的编写工作,直接在程序中导入该模块即可使用该功能。
前面讲了很多封装:
- 诸多容器,例如列表、元组、字符串、字典等,它们都是对数据的封装;
- 函数是对 Python 代码的封装;
- 类是对方法和属性的封装,也可以说是对函数和数据的封装。
- 模块也是一种封装,把能够实现某一特定功能的代码编写在同一个 .py 文件中。
2、模块导入:
借助 Python 现有的标准库或者其他人提供的第三方库。
两种导入方式:
-
import 模块名1 [as 别名1], 模块名2 [as 别名2],…
-
from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2],…
# 导入sys整个模块
import sys
# 使用sys模块名作为前缀来访问模块中的成员
print(sys.argv[0])
# argv[0] 用于获取当前 Python 程序的存储路径
给模块起别名:
import sys as s
# 使用s模块别名作为前缀来访问模块中的成员
print(s.argv[0])
一次性导入多个模块:
import sys,os
# 使用模块名作为前缀来访问模块中的成员
print(sys.argv[0])
# os模块的sep变量代表平台上的路径分隔符
print(os.sep)
导入多个模块分别指定别名:
# 导入sys、os两个模块,并为sys指定别名s,为os指定别名o
import sys as s,os as o
下面这种方法是指定模块内的成员名:
from 模块名 import 成员名 as 别名:
from sys import argv
# 使用导入成员的语法,直接使用成员名访问
print(argv[0])
为成员指定别名:
# 导入sys模块的argv成员,并为其指定别名v
from sys import argv as v
# 使用导入成员(并指定别名)的语法,直接使用成员的别名访问
print(v[0])
一次导入多个成员:
# 导入sys模块的argv,winver成员
from sys import argv, winver
# 使用导入成员的语法,直接使用成员名访问
print(argv[0])
print(winver)
3、自定义模块:
name = "Python教程"
add = "http://c.biancheng.net/python"
print(name,add)
def say():
print("人生苦短,我学Python!")
class CLanguage:
def __init__(self,name,add):
self.name = name
self.add = add
def say(self):
print(self.name,self.add)
if __name__ == '__main__':
say()
clangs = CLanguage("C语言中文网","http://c.biancheng.net")
clangs.say()
在test02.py文件下执行,可以得到:
Python教程 http://c.biancheng.net/python
人生苦短,我学Python!
C语言中文网 http://c.biancheng.net
在test01.py下执行:
Python教程 http://c.biancheng.net/python
测试函数只有在直接运行模块文件时才执行,则可在调用测试函数时增加判断,即只有当 name ==‘main’ 时才调用测试函数。
4、__all__用法:
当我们向文件导入某个模块时,导入的是该模块中那些名称不以下划线(单下划线“_”或者双下划线“__”)开头的变量、函数和类。因此,如果我们不想模块文件中的某个成员被引入到其它文件中使用,可以在其名称前添加下划线。
以前面章节中创建的 demo.py 模块文件和 test.py 文件为例(它们位于同一目录),各自包含的内容如下所示:
#demo.py
def say():
print("人生苦短,我学Python!")
def hello():
print("hello:china")
def show():
print("Python教程:http://c.biancheng.net/python")
#test.py
from demo import *
say()
hello()
show()
执行 test.py 文件:
人生苦短,我学Python!
C语言中文网:http://c.biancheng.net
Python教程:http://c.biancheng.net/python
如果 demo.py 模块中的 show() 函数不想让其它文件引入,则只需将其名称改为 _show() 或者 __show()。
通过在模块文件中设置 all 变量,当其它文件以“from 模块名 import *”的形式导入该模块时,该文件中只能使用 all 列表中指定的成员。
只有以“from 模块名 import *”形式导入的模块,当该模块设有 all 变量时,只能导入该变量指定的成员,未指定的成员是无法导入的。
def say():
print("人生苦短,我学Python!")
def CLanguage():
print("C语言中文网:http://c.biancheng.net")
def disPython():
print("Python教程:http://c.biancheng.net/python")
__all__ = ["say","CLanguage"]
上面代码中,只能显示出say()和CLanguage()。
再次声明,all 变量仅限于在其它文件中以“from 模块名 import *”的方式引入。也就是说,如果使用以下 2 种方式引入模块,则 all 变量的设置是无效的。
5、Python包:
包就是文件夹,只不过在该文件夹下必须存在一个名为“init.py” 的文件。
每个包的目录下都必须建立一个 init.py 的模块,可以是一个空模块,可以写一些初始化代码,其作用就是告诉 Python 要将该目录当成包来处理。
注意,init.py 不同于其他模块文件,此模块的模块名不是 init,而是它所在的包名。例如,在 settings 包中的 init.py 文件,其模块名就是 settings。
Python 库:相比模块和包,库是一个更大的概念,例如在 Python 标准库中的每个库都有好多个包,而每个包中都有若干个模块。
python包的导入:
- import 包名[.模块名 [as 别名]]
- from 包名 import 模块名 [as 别名]
- from 包名.模块名 import 成员名 [as 别名]
6、查看文档:
1、查看模块成员:
dir() 函数:
import string
print(dir(string))
all 变量:
import string
print(string.__all__)
2、查看文档和帮助信息:
- 使用 help() 函数来获取指定成员(甚至是该模块)的帮助信息。
import my_package
help(my_package.module1)
- 用 doc 变量获取其说明文档:
import my_package
print(my_package.module1.display.__doc__)
其实,help() 函数底层也是借助 doc 属性实现的。
3、查看模块的源文件路径:
通过 file 属性查找该模块(或包)文件所在的具体存储位置,直接查看其源代码。
import my_package
print(my_package.__file__)
注意,并不是所有模块都提供 file 属性,因为并不是所有模块的实现都采用 Python 语言,有些模块采用的是其它编程语言(如 C 语言)。