python--模块和包
一 . 模块
⾸先,我们先看⼀个老⽣常谈的问题. 什么是模块. 模块就是⼀个包含了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的时候, 我们先创建⼀个tianlong.py. 在该⽂件中创建
⼀些武林前辈和⼀些打⽃场景, 代码如下.
main_male_actor = '萧峰' def fight(): print(f'{main_male_actor}少林寺大战丁春秋,庄聚贤,慕容复') def end(): print('萧峰降龙十八掌天下第一')
然后在创建一个江湖.py 在该文件中使用import
import tianlong tianlong.fight() # 萧峰少林寺大战丁春秋,庄聚贤,慕容复 tianlong.end() # 萧峰降龙十八掌天下第一
在Python中模块是不能够重复导入的. 当重复导入模块时. 系统会根据sys.modules来判断
该模块是否已经导入了. 如果已经导入. 则不会重复导入
# 如果我在tianlong.py文件中写一个print('====飞雪连天射白鹿,笑书神侠倚碧鸳====') # 然后在jainghu.py 文件中引入import tianlong 无论引入多少次,都只打印一次 # ====飞雪连天射白鹿,笑书神侠倚碧鸳====
导入模块的时候:
1. 去判断当前正在导入的模块是否已经倒入过
2. 如果已经导入过,不会重新导入该模块
3. 如果没有导入过. 首先开辟一个内存空间
4. 把该模块中的代码放在新开辟的空间中. 运行该模块中的代码
5. 把该文件的名字作为当前名称空间的名字(前提是没有as)
在Python中. 每个模块都有⾃⼰的__name__ 但是这个__name__的值是不定的. 当我们把⼀个模块作为程序运⾏的入⼝时.
此时该模块的__name__是"__main__" , ⽽如果我们把模块导入时. 此时模块内部的__name__就是该模块⾃⾝的名字
我们可以利⽤这个特性来控制模块内哪些代码是在被加载的时候就运⾏的. 哪些是在模块
被别⼈导入的时候就要执⾏的. 也可以屏蔽掉⼀些不希望别⼈导入就运⾏的代码. 尤其是测试代码.
if __name__ == '__main__': tianlong.main_male_actor = '萧峰' # 此时, 只有从该模块作为入运行的时候才会把main_male_actor设置成萧峰 print("哇哈哈哈哈哈") # 只有运行该模块才会打印. import的时候是不会执行这里的代码的
最后,切记,不要重名,我们创建的py 文件的名字千万不要和系统内置模块重名.