目录
1. 导入模块
2. 定义自己的模块
3. 为模块编写说明文档
4. 加载模块
1)使用环境变量
2)将模块放在默认的模块加载路径下;
5. 包
1) 定义包
2)导入包
6. 查看模块包含的内容
1)查看模块含有哪些功能
2)使用__doc__属性查看文档
3)使用__file__属性查看模块的源文件路径
使用import导入模块,有两种方式:
1)导入整个模块
import 模块名1 [ as 别名1 ] ,模块名2[ as 别名2 ] ,...
访问模块成员需要使用模块名调用;
可一次导入多个模块;
可以为模块指定别名;
#导入sys整个模块
import sys
#使用模块名访问模块中的成员
prrnt(sys . argv[0])
2)导入模块中的指定成员
from 模块名 import 成员名1 [ as 别名1 ] ,成员名2[ as 别名2 ] ,…
访问模块成员直接使用成员名或成员别名即可;
#导入sys模块内的argv成员
from sys import argv
#直接使用成员名访问
print (argv[O])
3) 导入模块的本质
不管使用哪种方式导入,首先都会将模块的全部代码加载到内存并执行;
导入整个模块时将整个模块内容赋值给与模块同名的变量,在该模块中定义的所有程序单元都相当于该module对象的成员。
使用from.. .import 导入模块中部分成员,只导入指定变量、函数等成员单元;
模块就是Python 程序!任何Python 程序都可作为模块导入。
模块文件的文件名就是它的模块名,比如module1.py 的模块名就是module1 。
只要在模块开始处定义一个字符串直接量即可。例如,在module1.py 文件的第一行代码之前添加如下内容。
'''
这是我们编写的第一个模块,该模块包含以下内容
my book : 字符串变量
say hi : 简单的函数
User : 代表用户的类
'''
这段字符串内容将会作为该模块的说明文挡,可通过模块的__doc __属性来访问文档。
为了让Python 能找到我们编写(或第三方提供)的模块,可以用以下两种方式来告诉它:
“此电脑”——“属性”——“高级系统设置”——“环境变量”——“用户变量”
“新建用户变量”——“变量名”文本框内输入PYTHONPATH,表明将要建立名为PYTHONPATH 的环境变量:在“变量值”文本框内输入模块所在文件夹的路径,多条路径使用分号分隔开;(注:可以用一个点” . “表示一条路径,这个点代表当前程序运行的路径,表明当运行Python 程序时, Python总能从当前路径加载模块)
如果要安装某些通用性模块,这种模块应该直接安装在Python 内部,以便被所有程序共享,此时就可借助于Python 默认的模块加载路径。
Python 默认的模块加载路径由sys.path 变量代表, 因此可通过执行命令来查看Python 默认的模块加载路径:
import sys, pprint
# 使用pprint模块下的pprint()函数代替普通的print()函数,这是因为如果要打印的内容很多,使用pprint可以显示更友好的打印结果。
pprint.pprint(sys.path)
通常来说,我们应该将Python的扩展模块添加在lib\site-packages 路径下,它专门用于存放Python 的扩展模块和包;
对于一个模块,往往会具有很多程序单元,包括变量、函数和类等,如果将整个模块的所有内容都定义在同一个Python 源文件中,这个文件将会变得非常庞大;
所以使用几个Python源文件定于一个模块,将这几个Python源文件存储到一个文件夹中,这就是包。
包本质上还是模块;
定义一个最简单的的包分两步进行:1)创建一个文件夹,文件名就是包名;2)在该文件夹中创建一个__init__.py 文件;
使用“ import 包名 ”导入一个包的本质就是导入该包下的__init__.py文件,然后将整个文件内容赋值给与包同名的变量,该变量的类型是module。
几种导入包的方式如下:
# 导入test_packet包,实际上就是导入包下的__init__.py 文件
#执行这条导入语句之后,程序只能使用test_packet目录下的__init__.py文件中定义的程序单元。
import test_packet
# 导入test_packet包下的test模块, 实际上就是导入test_packet目录下的test.py文件
# 使用这种导入方式,访问test.py文件中定义的成员变量需要使用test_packet.test作为前缀来调用
import test_packet.test
test_packet.test.describe()
# 导入test_packet包下的test2模块, 实际上就是导入test_packet目录下的test2.py文件
# 使用这种导入方式,访问test2.py文件中定义的成员变量需要使用test2作为前缀来调用
from test_packet import test2
test2.information()
__init__.py 文件的主要作用就是导入该包内的其他模块,程序调用该包的模块时不需要再次分别导入各个模块;
所以可以在每个包的__init__.py文件中导入该包的其他模块,程序调用该包时只需要导入该包就可以了;
# 从当前包中导入test模块, 当程序调用test模块中的成员时,格式为“ test_packet.test.成员变量名 ”
from . import test
# 如果在上一句代码的基础上加上这句代码,从test模块中导入所有成员变量, 当程序调用test模块中的成员时,格式为“ test_packet.成员变量名 ”
from .test import *
有两种方法:1)dir()函数;2)模块本身提供的__all__变量(不是所有的模块都有这个变量);
1)dir函数
该函数可用于返回模块或类所包含的全部程序单元(包括变量、函数、类和方法等),但直接使用dir()函数默认会列出模块内所有的程序单元,包括以下画线开头的程序单元,而这些以下画线开头的程序单元其实并不希望被外界使用。
import string
import pprint
# 使用dir()函数
pprint.pprint(dir(string))
# ['Formatter',
# 'Template',
# '_ChainMap',
# '_TemplateMetaclass',
# '__all__',
# '__builtins__',
# '__cached__',
# '__doc__',
# '__file__',
# '__loader__',
# '__name__',
# '__package__',
# '__spec__',
# '_re',
# '_string',
# 'ascii_letters',
# 'ascii_lowercase',
# 'ascii_uppercase',
# 'capwords',
# 'digits',
# 'hexdigits',
# 'octdigits',
# 'printable',
# 'punctuation',
# 'whitespace']
所以为了不显示以下画线开头的程序单元,使用改进方法:
import string
import pprint
# 使用dir()函数
list = [i for i in dir(string) if not i.startswith("_")]
pprint.pprint(list)
# ['Formatter',
# 'Template',
# 'ascii_letters',
# 'ascii_lowercase',
# 'ascii_uppercase',
# 'capwords',
# 'digits',
# 'hexdigits',
# 'octdigits',
# 'printable',
# 'punctuation',
# 'whitespace']
2)模块本身提供的__all__变量
import string
import pprint
# 使用__all__变量
pprint.pprint(string.__all__)
# ['ascii_letters',
# 'ascii_lowercase',
# 'ascii_uppercase',
# 'capwords',
# 'digits',
# 'hexdigits',
# 'octdigits',
# 'printable',
# 'punctuation',
# 'whitespace',
# 'Formatter',
# 'Template']