模块和包
一、模块
模块其实就是一个文件···
使用import导入模块—全局变量、函数、类
使用from···import···导入部分工具,不导入模块的所有工具
from 模块名 import 工具名
这样导入的好处是可以直接使用导入的额这些工具,不需要使用 模块名.工具
1.给模块指定别名
import 模块名 as 别名
别名要符合大驼峰命名法
大驼峰命名法:没有下划线,首字母大写
2.from···import···导入相同变量名&函数名&类的情况
这种情况,会执行后者导入的变量&函数&类
主要原因是后者导入会 覆盖 前者导入的内容
tips1:鉴于上面会出现的情况,一般导入会放在整个代码最上面,及时发现重名问题
tips2:也可以使用别名的方式来解决重名的问题
3.from···import *导入所有工具
这样的好处:可以直接使用,不需要使用模块名.工具的方法
这样的坏处:如果出现重名,就会很麻烦,排查会非常困难
所以,这个方法,不推荐使用!!!
4.导入模块的搜索顺序
①、搜索 当前目录 指定模块名的文件
②、如果没有,再搜索 系统目录
所以,给文件命名时,不能跟系统的模块文件重名!!!!一旦重名,导入系统模块将无法正常运行
5.开发原则&执行未缩进代码
①、开发原则:开发的所有模块应该都是可以被导入的
②、导入模块时,会默认执行未缩进的代码
简单演示:
test文件:
a = 123
print("你好呀!你导入了我的模块呢···")
主文件
import test
print(test.a)
执行结果:
解决上述问题的方法···name
①、python内置属性__name__
python中__name__内置属性里常年保存着__main__这个字符串,只有当这个模块被导入的时候,属性__name__才会被替换成导入方的目录名
②、利用__name__解决上述问题
一般可以直接执行的代码,再实际开发中,都作为模块的测试代码,程序员在开发的时候,需要这些代码来测试模块是不是能正常运行==,然而我们并不希望在导入的时候执行这些测试代码,所以可以对__name__保存的字符串进行判断来解决导入的时候执行这些代码的问题:
简单代码
test文件:
a = 123
def main(): # 把这些测试代码都放在这个main函数里,被导入时不会执行
print("你好呀!你导入了我的模块呢···")
if __name__ == "__main__":
main()
主文件的内容不变
此时运行主文件的输出结果:
二、包(Package)
概念:包是一个包含多个模块的特殊目录
tips1:目录下 必须 有一个特殊的文件__init__.py
tips2:包名的命名方式和变量一样:小写字母+“_”
import 包名 可以一次性导入包中的所有模块
1.文件__init__的作用
在此文件中定义对外界提供的模块
没有在此定义的模块,是无法向外界提供的
代码基本实现
文件目录树
message包里封装了两个模块
文件__inint__.py
from . import receive_message
from . import send_message
文件receive_message.py
def receive():
print("接受消息中···")
文件send_message.py
def send(txt):
print("正在发送消息%s···" % txt)
外界文件test.py
import message
message.receive_message.receive()
message.send_message.send("hello fiona···")
执行结果!
注意:
①、经过测试,如果没有在__init__文件中定义对外界导出的模块,那些模块是导不出去的
②、文件__init__中 "from . "表示从当前目录导入模块