模块和包
0. 了解模块
Python模块(Module),是一个Python 文件,以.py 结尾,包含了Python对象定义和Python语句。模块能定义函数,类和变量,模块里也能包含可执行的代码。
在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字。

模块的作用:降低工作量,常用功能封装成某个模块,使用时只需要调用模块的功能,就可以完成某些需求。
1. 导入模块
import 模块名from 模块名 import 功能名(可以多个功能用逗号隔开)from 模块名 import *(*指代所有功能)
as定义别名:(只能用别名,原来的名字不能用,会报错)
import 模块名 as 别名(模块定义别名)from 模块名 import 功能名 as 别名(功能定义别名)
可以import 模块名,模块名...但不建议这样写,推荐用多行import来导入模块。更多的是出于操作便利性的原因,与代码本身无关。
# 导入模块
import 模块名
# 调用功能
模块名.功能名()
import math
print(math.sqrt(9)) #3.0
#from math import sqrt
#print(sqrt(9)) #3.0
#from math import *
#print(sqrt(9)) #3.0
等待2s然后执行打印hello
"""
import time as tt
# 等待2s然后执行打印hello
tt.sleep(2)
print('hello')
"""
from time import sleep as sl
sl(2)
print('hello')
2. 制作模块
自定义模块名必须要符合标识符命名规则。
步骤:
- 定义模块
- 测试模块
- 调用模块
新建Python文件(my_module.py),命名并定义功能函数
# 定义模块(模块名满足标识符规则)
def test(a,b):
print(a+b)
# 测试模块
# test(1,5) #6
# 测试信息保留且不被其他文件调用执行,只在当前文件中调用
# print(__name__) # __main__
# 如果上面这句不被注释,而被其他文件调用,结果就不是__main__了,而是my_module
# __name__是系统变量,是模块的标识符,值是:如果是自身模块是__main__,否则是当前模块的名字
if __name__ == '__main__':
test(1,5) #6
import my_module
# 调用模块
my_module.test(3,4) # 7
3. 模块的定位顺序
由近及远
当导入一个模块,Python解析器对模块位置的搜索顺序是∶
1.当前目录
2.如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。(解释器目录)
3.如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/pythonl
模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
自己的文件名(当前目录)不要和已有模块名(在解释器目录)重复,否则导致模块功能无法使用。//优先用当前目录
使用from 模块名 import功能的时候,如果功能名字重复,调用到的是最后定义或导入的功能。
# 使用 from 模块名 import 功能的时候,如果功能名字重复,调用到的是最后定义或导入的功能
from time import sleep
sleep(2) # 隔2s运行结束
def sleep():
print('自定义的sleep')
# sleep(2) # TypeError: sleep() takes 0 positional arguments but 1 was given
# 使用 import 模块名 不用担心功能名重复
# 名字重复的危险性
import time
print(time) #<module 'time' (built-in)>
# 变量和模块名相同,如果变量在后,会覆盖模块功能
time = 1
print(time) #1
# Q:为什么变量也能覆盖模块?
# A:在Python语言中,数据是通过引用传递的
4. all列表
如果一个模块文件中有__all__变量,当使用from xxx import *导入时,只能导入这个列表中的元素。
# my_module1.py
__all__=['testA']
def testA():
print('testA')
def testB():
print('testB')
from my_module1 import *
testA() #testA
#testB() #NameError: name 'testB' is not defined
5.了解、制作包
包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py文件,那么这个文件夹就称之为包。
[New]--[Python Package]--输入包名--[OK]--新建功能模块(有联系的模块)。
注意:新建包后,包内部会自动创建__init__.py文件,这个文件控制着包的导入行为。

新建包内模块
# my_module1.py
print(1)
def info_print1():
print('my_module1')
# my_module2.py
print(2)
def info_print2():
print('my_module2')
导入、调用包
# 法一
import 包名.模块名
# 调用
包名.模块名.目标
# 法二:在__init__.py文件中添加__all__ =[],控制允许导入的模块或功能列表。
from 包名 import *
# 调用
模块名.目标
import mypackage.my_module1
mypackage.my_module1.info_print1()
'''
1
my_module1
'''
from mypackage import *
my_module1.info_print1()
# 如果__init__中没有设置all列表,会不能导入任何一个模块,
# NameError: name 'my_module1' is not defined
# 在__init__.py文件中添加__all__ =['my_module1'],上一句正常运行,结果如下,my_module2不能导
'''
1
my_module1
'''
my_module2.info_print2() #NameError: name 'my_module2' is not defined

浙公网安备 33010602011771号