今天我们来聊聊模块和包
一.模块
首先,我们先看一个老生常谈的问题,什么是模块,模块就是一个包含了python定义和声明的文件,文件名就是模块的名字加上.py后缀,欢聚话说我们目前写的所有的py文件都可以看成是一个模块但是我们import加载的模块一共分成四个通用类别:
1. 使用pyhton编写的py文件
2. 已被变异为共享库或者DLL或C或者C++的扩展
3. 包好一组模块的包.
4. 使用c编写并连接到python解释器的内置模块
为什么要使用模块? 为了我们写的代码可以重用,不至于把所有的代码都写在一个文件内. 当项目规模比较小的时候,完全可以使用一个py搞定整个项目的开发,但是如果是一个非常庞大的项目. 此时就必须要把相关的功能进行分离,以便我们的日常维护,以及新项目的开发.
如何使用模块? 我们已用过很多模块了,导入模块有两种方式
1. import 模块
2. from xxx import xxxx
二.import
首先我们先看import, 在使用import的时候, 我们先创建一个yitian.py. 在该文件中创建一些武林前辈和一些打斗场景, 代码如下:
print("片头曲. 啊! 啊~ 啊! 啊. 啊啊啊啊啊啊啊...")
main_person_man = "张无忌"
main_person_woman = "赵敏"
low_person_man_one = "成昆"
low_person_man_two = "周芷若"
def fight_on_light_top():
print("光明顶大战", main_person_man, "破坏了", low_person_man_one, "的大阴谋")
def fight_in_shaolin():
print("少林寺大战", main_person_man, "破坏了", low_person_man_two, "的大阴
谋")
接下来,金庸上场
import yitian
print(yitian.main_person_man) # 使用模块中定义好的名字
print(yitian.low_person_man_one)
yitian.fight_in_shaolin() # 调用模块中的函数
yitian.fight_on_light_top()
此时我们在金庸模块中引入了yitian模块.
在Python中模块是不能够重复导入的,当重复导入模块时,系统会根据sys.modules来判断该模块是否已经导入了,如果已经导入,则不会重复导入
import sys
print(sys.modules.keys()) # 查看导入的模块.
import yitian # 导入模块. 此时会默认执行该模块中的代码
import yitian # 该模块已经导入过了,不会重复执行代码
import yitian
import yitian
import yitian
import yitian
导入模块的时候都做了些什么? 首先,在导入模块的一瞬间,python解释器会先通过sys.modules来判断该模块是否已经导入了该模块,如果已经导入了则不再导入,如果该模块还未导入过,则系统会做三件事.
1. 为导入的模块创立新的名称空间
2. 在新创建的名称空间中运行该模块中的代码
3. 创建模块的名字,并使用该名称作为该模块在当前模块中引用的名字.
我们可以使用globals来查看模块的名称空间
print(globals())
打印结果:
{'__name__': '__main__', '__doc__': None, '__package__': None,
'__loader__': <_frozen_importlib_external.sourcefileloader object at>
0x10bbcf438>, '__spec__': None, '__annotations__': {}, '__builtins__'