Python学习笔记(17)-模块、包
模块
Python中一个.py文件就是一个模块,我们可以通过引入模块来使用模块中的功能
import
引入模块的方法:import 模块名
使用模块中功能的方法:模块名.功能(功能指类或者函数等)
示例:
import test_msg test_msg.test()
运行结果:
---test---
注意:
1、test_msg.py中代码
def test(): print("---test---")
2、import 模块名时不要带.py后缀,如错误示例 import test_msg.py
3、模块分三种:系统自带的模块如random,下载安装的第三方模块如pygame,自己写的自定义模块如上面的test_msg,其中要想引入自定义的模块test_msg,执行import test_msg代码的位置要与模块处于同一层目录下
from import
如果想直接引入模块中的某一部分功能,引入的方法为from 模块名 import 功能1,功能2.....等
示例:
from test_msg import test1,test2 test1() test2()
运行结果:
---test1--- ---test2---
说明:
1、test_msg.py中代码
def test1(): print("---test1---") def test2(): print("---test2---")
2、由于直接引入了功能,所以执行时不再是test_msg.test1()而直接是test1()
3、同样执行代码的位置要与模块处于同一层目录下
from import *
如果一个模块中的功能非常多,通过写功能名的方式导入有些繁琐,还有种导入模块中功能的方法为from 模块名 import *,*号代表所有功能
示例:
from test_msg import * test1() test2()
运行结果:
---test1--- ---test2---
注意:
这种导入方式不适合多个模块中有功能名称相同的情况,如两个模块中都有函数名test(),当使用功能时只会使用最后调用的那个
__all__
当以from 模块名 import *方式导入模块功能时,可通过在模块中添加__all__变量来指定允许导入哪些功能
示例:
test_msg.py中代码
__all__ = ["test1","test2"] def test1(): print("---test1---") def test2(): print("---test2---") def test3(): print("---test3---")
执行代码
from test_msg import * test1() test2() test3()
运行结果:
Traceback (most recent call last): File "F:/untitled/Python_jichu/模块/main.py", line 4, in <module> test3() ---test1--- ---test2--- NameError: name 'test3' is not defined
注意:
1、__all__前后为两个下划线
2、__all__类型为列表,每个元素是导入模块中的功能名字的字符串
3、未写入__all__列表中的功能不会被引入
as
如果一个模块名字过长,我们可以通过as将模块重新命名
命名方法:import 模块名 as 自定义模块名
示例:
import test_msg as abc abc.test1() abc.test2() abc.test3()
运行结果:
---test1--- ---test2--- ---test3---
模块的搜索顺序
当我们导入一个模块时,Python会先从当前路径下搜索,如果当前路径下不存在则搜索系统模块所在路径,系统模块路径可通过打印os.__file__查看,前提是要导入os模块(import os)
__name__==__main__
一个模块被引入的时候会将模块中的代码从头到尾执行一遍
示例:
test_msg中代码
def test1(): print("---test1---") def test2(): print("---test2---") def test3(): print("---test3---") test1() test2() test3()
执行代码
import test_msg test_msg.test1() test_msg.test2() test_msg.test3()
运行结果:
---test1--- ---test2--- ---test3--- ---test1--- ---test2--- ---test3---
很显然调用者只想看到一遍输出结果,但由于引入模块时已经执行了一遍模块中的代码,最终结果显示了两遍,但是编写test_msg模块的人又需要测试代码是否可以正常运行,那么显然将模块中的调用方法删除不是好的处理方式
模块中存在一个变量__name__,如打印这个变量在模块自身执行时输出"__main__",在调用者处执行时输出模块名即"send_msg",那么在模块中只要编写if __name__=="__main__"时才调用方法,那么通过引入模块方式调用功能时则不会执行
示例:
test_msg中代码
def test1(): print("---test1---") def test2(): print("---test2---") def test3(): print("---test3---") if __name__=="__main__": test1() test2() test3()
执行代码
import test_msg test_msg.test1() test_msg.test2() test_msg.test3()
运行结果
---test1--- ---test2--- ---test3---
注意:
__main__是字符串
包
多个模块放在一个文件夹中,且文件夹中含有__init__.py文件,这个文件夹称作包
__init__中__all__
想要以from方式从包中引入模块,需要在__init__文件中写入需要引入模块的名字,方式为__all__ = [模块名1,模块名2等]
示例: