概念

包:(Package)

包:是一个有层级的目录结构,包含n个模块或者n个子包,包中一定要有__init__.py文件,所以包只是一个组织方式,更加有条理,并不是必须的。

模块:(Module)

模块:是一个单独的.py文件,用于存放一些功能相关的代码,所以当然是应用实现的核心。

库:(Library)

库:是完成一个“大"功能的代码集合,表现形式通常是包。

三者的关系:

库可以是包的集合或者模块的集合,最主要是完成一个整体应用,侧重功能的完整性。
包是库的组织形式,使得在开发一个库的时候,如果有一些模块功能紧密相关,那么就放在一个包里,由于有很多模块,那么按照功能差异,可能会分给很多个包。最终,形成一个库。
模块:是一个单独的.py文件,用于实现一个小功能。

导入

在python中,一个包是一个带有特殊文件__init__.py的目录。__init__.py文件定义了包的属性和方法。

不过,它可以什么也不定义,可以只是一个空文件,但是必须存在。如果 __init__.py不存在,这个目录就仅仅是一个目录,而不是一个包,因此它就不能被import导入。

其实,我们在导入一个包时,实际上导入了它的__init__.py文件。

导入包:

import 包

导入模块:

1.import 包.模块
2.from 包 import 模块

注意:直接导入一个包,由于只是执行包中的__init__.py文件的内容,所以如果该文件为空,则不会导入任何包中的模块。所以我们有时会在__init__.py文件中对需要的模块进行导入,什么意思?下面给出了一篇文章,不但介绍了__init__.py文件的作用,也介绍了__all__的含义,由于已经写得很好也很精简,所以我就没有重写,直接搬运了:,大家可以支持原作者。


搬运开始


1、在使用PyCharm新建python package时,会发现生成的包里,有__init__.py 这个文件,而且这文件是空的。

python 库 python库和包的区别_Python

既然是空的?那删了吧!

删了就悲剧咯,这货算是package的一个标识,IDE就是通过它来判断package的。

当然,它还有另外一个作用,暂且不提它,先说说__all__。

2、Python中的包和模块有两种导入方式:精确导入和模糊导入

以上图为例,精准导入,假如A.py里有函数A1(),A2()。

此时B.py需要引用它们,可以如下:

from hello.A import A1,A2

假如方法比较多,或许会偷懒,用模糊导入:

from hello.A import *

而__all__,则可以控制*所表示要引入的东西(模块,函数,类等):

python 库 python库和包的区别_Python_02

python 库 python库和包的区别_Python_03

如果将__all__里的sayA2去掉,B.py里就会报sayA2查找不到的错误。

3、__init__.py的用法:

当然__all__也可以在__init__.py里声明,__init__.py是上图hello目录下的,可以理解为,该目录下py文件的函数都统一到__init__.py来声明

python 库 python库和包的区别_Python_04

python 库 python库和包的区别_python_05

python 库 python库和包的区别_python 库_06

此时B.py里只是引入hello目录,并未精准到py文件。


搬运结束



参考资料:



1、在使用PyCharm新建python package时,会发现生成的包里,有__init__.py 这个文件,而且这文件是空的。

python 库 python库和包的区别_Python

既然是空的?那删了吧!

删了就悲剧咯,这货算是package的一个标识,IDE就是通过它来判断package的。

当然,它还有另外一个作用,暂且不提它,先说说__all__。

2、Python中的包和模块有两种导入方式:精确导入和模糊导入

以上图为例,精准导入,假如A.py里有函数A1(),A2()。

此时B.py需要引用它们,可以如下:

from hello.A import A1,A2

假如方法比较多,或许会偷懒,用模糊导入:

from hello.A import *

而__all__,则可以控制*所表示要引入的东西(模块,函数,类等):

python 库 python库和包的区别_Python_02

python 库 python库和包的区别_Python_03

如果将__all__里的sayA2去掉,B.py里就会报sayA2查找不到的错误。

3、__init__.py的用法:

当然__all__也可以在__init__.py里声明,__init__.py是上图hello目录下的,可以理解为,该目录下py文件的函数都统一到__init__.py来声明

python 库 python库和包的区别_Python_04

python 库 python库和包的区别_python_05

python 库 python库和包的区别_python 库_06

此时B.py里只是引入hello目录,并未精准到py文件。