概念
包:(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 这个文件,而且这文件是空的。
既然是空的?那删了吧!
删了就悲剧咯,这货算是package的一个标识,IDE就是通过它来判断package的。
当然,它还有另外一个作用,暂且不提它,先说说__all__。
2、Python中的包和模块有两种导入方式:精确导入和模糊导入
以上图为例,精准导入,假如A.py里有函数A1(),A2()。
此时B.py需要引用它们,可以如下:
from hello.A import A1,A2
假如方法比较多,或许会偷懒,用模糊导入:
from hello.A import *
而__all__,则可以控制*所表示要引入的东西(模块,函数,类等):
如果将__all__里的sayA2去掉,B.py里就会报sayA2查找不到的错误。
3、__init__.py的用法:
当然__all__也可以在__init__.py里声明,__init__.py是上图hello目录下的,可以理解为,该目录下py文件的函数都统一到__init__.py来声明
此时B.py里只是引入hello目录,并未精准到py文件。
搬运结束
参考资料:
1、在使用PyCharm新建python package时,会发现生成的包里,有__init__.py 这个文件,而且这文件是空的。
既然是空的?那删了吧!
删了就悲剧咯,这货算是package的一个标识,IDE就是通过它来判断package的。
当然,它还有另外一个作用,暂且不提它,先说说__all__。
2、Python中的包和模块有两种导入方式:精确导入和模糊导入
以上图为例,精准导入,假如A.py里有函数A1(),A2()。
此时B.py需要引用它们,可以如下:
from hello.A import A1,A2
假如方法比较多,或许会偷懒,用模糊导入:
from hello.A import *
而__all__,则可以控制*所表示要引入的东西(模块,函数,类等):
如果将__all__里的sayA2去掉,B.py里就会报sayA2查找不到的错误。
3、__init__.py的用法:
当然__all__也可以在__init__.py里声明,__init__.py是上图hello目录下的,可以理解为,该目录下py文件的函数都统一到__init__.py来声明
此时B.py里只是引入hello目录,并未精准到py文件。