包是存放多个模块的文件夹,作用是包含多个模块,本质依然是模块,所以包中也可以包含包
库:相比模块和包,库是一个更大的概念,在Python标准库中的每个库都有好多个包,而每个包中都有若干个模块
每个包的目录下都必须建立一个__init__.py 的模块,作用是告诉 Python 要将该目录当成包来处理
定义包:
创建一个文件夹,文件夹的名字就是该包的包名
在该文件夹内添加一个 __init__.py 文件,此文件中可以不编写任何代码
先新建一个test文件夹,在文件夹中添加一个 __init__.py 文件:
#该包的说明文档
'''
这是一个简单的包
'''
print('这是一个简单的包')
使用该包
import test
print(test.__doc__)
print(type(test))
print(test)
这是一个简单的包
这是一个简单的包
<class 'module'>
<module 'test' from 'C:/Users/Administrator/Desktop/2021-1-14\\test\\__init__.py'>
导入包的本质就是加载井执行该包下的 __init__.py 文件,将整个文件内容赋值给与包同名的变量,该变量的类型是 module
包被导入之后,会在包目录下生成一个 __pycache__ 文件夹,并在该文件夹内为包生成一个 __init__.cpython-36.pyc 文件
导入包就相当于导入该包下的 __init__.py 文件,包的主要作用是包含多个模块,__init__.py 文件的主要作用就是导入该包内的其他模块
创建好包之后,可以向包中添加模块(或者包),这里给test包添加模块,分别为module1.py、module2.py
#module1.py模块文件
def display(arc):
print(arc)
#module2.py 模块文件
class TEST:
def display(self):
print("youchanwill")
所设置的包的结构
test
┠__init__.py
┠module1.py
┗module2.py
包的本质就是模块,导入模块时,当前程序中会包含一个和模块名同名且类型为 module 的变量,导入包也是如此
import 包名[.模块名 [as 别名]]
导入 module1 模块并使用该模块中成员
import test.module1
test.module1.display("youchanwill.com")
这是一个简单的包
youchanwill.com
此语法格式导入包中的指定模块后,在使用该模块中的成员(变量、函数、类)时,需添加“包名.模块名”为前缀
使用 as 给包名.模块名”起一个别名,就直接使用这个别名作为前缀使用该模块中的方法
import test.module1 as module
module.display("youchanwill.com")
这是一个简单的包
youchanwill.com
直接导入指定包时,会自动执行该包所对应文件夹下的 __init__.py 文件中的代码
直接导入包名,并不会将包中所有模块全部导入到程序中,作用仅仅是导入并执行包下的 __init__.py 文件
from 包名 import 模块名 [as 别名]
from test import module1
module1.display("youchanwill.net")
这是一个简单的包
youchanwill.net
此语法格式导入包中模块后,在使用其成员时不需要带包名前缀,但需要带模块名前缀
可以使用 as 为导入的指定模块定义别名
from test import module1 as module
module.display("youchanwill.net")
这是一个简单的包
youchanwill.net
from 包名 import * 和 import 包名 的作用一样,都只是将该包的 __init__.py 文件导入并执行
from 包名.模块名 import 成员名 [as 别名]
该方式导入的变量(函数、类),在使用时可以直接使用变量名(函数名、类名)调用
from test.module1 import display
display("chanwill.com")
这是一个简单的包
chanwill.com
使用 as 为导入的成员起一个别名
from test.module1 import dis
dis("chanwill.com")
这是一个简单的包
chanwill.com
此语法格式加载指定包的指定模块时,可以使用 * 代替成员名,表示加载该模块下的所有成员
from test.module1 import *
display("you")
dir() 函数,可以查看某指定模块包含的全部成员(包括变量、函数和类)
这里的全部成员,不仅包含可供调用的模块成员,还包含所有名称以双下划线“__”开头和结尾的成员(在本模块中使用,不希望被其它文件调用)
通过 dir() 函数查看string模块中包含哪些成员
import string
print(dir(string))
['ChainMap', 'Formatter', 'Template', '_TemplateMetaclass', '__builtins__', '__cached__', '__doc__', '__file__'...
忽略显示 dir() 函数输出的特殊成员
import string
print([e for e in dir(string) if not e.startswith('_')])
通过列表推导式,可在 dir() 函数输出结果的基础上,筛选出有用的成员并显示
使用 __all__ 变量,查看模块(包)内包含的所有成员
import string
print(string.__all__)
__all__ 变量在查看指定模块成员时,不会显示模块中的特殊成员,同时还会根据成员的名称进行排序显示
*并非所有的模块都支持使用 __all __ 变量,对于获取有些模块的成员,就只能使用 dir() 函数
help() 函数获取指定成员(模块)的帮助信息
先使用dir() 函数,查看test包中有多少可供调用的成员
from test.module1 import *
from test.module2 import *
import test
print([e for e in dir(test) if not e.startswith('_')])
['module1', 'module2']
用help() 函数查成员的具体含义
import test
from test.module1 import *
help(test.module1)
这是一个简单的包
Help on module test.module1 in test:
NAME
test.module1
FUNCTIONS
display(arc)
FILE
c:\users\administrator\desktop\2021-1-14\test\module1.py
用 help() 函数查看具体成员的信息,该成员本身就包含表示自身身份的说明文档(字符串,位于该成员内部开头的位置),无论是函数还是类或者模块,都可以使用__doc__属性获取它们的说明文档
用 __doc__ 变量获取说明文档
import test
help(test..__doc__)
'这是一个简单的包'
help() 函数底层是借助 __doc__ 属性实现的
如果用help() 函数或__doc__属性,仍然无法满足需求:
调用__file__ 属性,查看该模块或者包文件的具体存储位置,直接查看其源代码
对于非自定义的模块或者包,可以查阅 Python 库的参考文档
Python库的参考文档:The Python Standard Library
通过__file__属性查找该模块(或包)文件所在的具体存储位置,直接查看其源代码
import test
print(test.__file__)
C:\Users\Administrator\Desktop\2021-1-14\test\__init__.py
导入test包时,其实际上执行__init__.py文件,所以这里查看test包的存储路径,输出__init__.py文件的存储路径
import string
print(string.__file__)
F:\Python\lib\string.py
通过调用__file__ 属性输出的绝对路径,可以轻易找到该模块(或包)的源文件
并不是所有模块都提供__file__属性,因为不是所有模块都采用Python,有些模块采用的是其它编程语言