模块
一般情况下,是一个以.py为后缀的文件。使用import导入。我们创建一个py文件,名为myprint,该py文件作为模块,在里面定义一个函数名为myprint:
def myprint():print('这是我的print模块')
保存后,在同目录下创建一个py文件,里面使用import导入包,并且使用模块名调用我们刚刚定义的myprint.py文件中的myprint函数。
import myprint
myprint.myprint()
结果为:
以上代码导入模块后,使用模块名myprint调用模块中的myprint()函数,调用使用点“.”运算符。
包
为避免模块名冲突,python引入了按目录组织模块的方法,称之为包。包是含有python模块的文件夹。
包是比模块更大的概念,包包含了模块。
例如当前目录有一个文件夹名为bao,在bao文件夹目录下,有一个py文件,名为module,里面的内容为:
def myMouduleprint():print('这是我包里面的Moudule模块')
我们还需要在这个文件夹下新建一个py文件,名为__init__,里面什么都可以不用写。创建完毕后,我们复制这个module.py文件到上级目录。这时,这个文件夹就是一个包,这个包下可以包含多个模块。
这时新建一个py文件,名为main,我们在main里面引入包,并且也引入main.py文件同目录下的module.py模块。
包的引入使用from作为关键字,我们可以理解为from后面接我们接下来要引入的模块来自于那个包,我是在bao文件夹下存放的module模块,并且在bao文件夹下创建了一个__init__文件,这个文件放在文件夹的目录下,则代表这个这个文件夹为包。所以,from后面接我们要引入的模块来自bao这个文件夹(包),我们需要在这个文件夹下引入里面的一个模块,所以使用import,这个模块名为module所以代码写为:
from bao import module
所有代码为:
from bao import module
import modulemodule.myMouduleprint()
这时我们引入了两个module,一个是从包bao里面引入的module模块,一个是从import引入的相同目录下的module模块。之后使用module调用了里面的myMouduleprint()函数。
为了方便区分层级关系,我们首先修改外面这个模块里面的myMouduleprint()函数显示内容:
def myMouduleprint():print('这是我包外面的Moudule模块')
修改完后,我们把main文件运行,查看结果:
这个时候就输出的是外面的module模块的函数;这个时候就产生了同名模块冲突的问题,其实在这里两个模块都被引入了进来,但是由于重名的原因,导致module直接调用为最外层的module;我们的包可以很好的解决这种问题,我们修改from 包的引入使模块重命名,我们调用两个模块的函数,代码如下:
from bao import module as md
import modulemodule.myMouduleprint()
md.myMouduleprint()
运行结果如下:
使用包可以很好的区分层级关系,防止重名的问题,虽然这个例子有点牵强的解释了这个特性,但是最主要的是理解包与模块的概念。
包可以包含多个模块,但是模块就是模块,是相对于包来说最小的单位,不可再细化。