模块和包

0. 了解模块

Python模块(Module),是一个Python 文件,以.py 结尾,包含了Python对象定义和Python语句。模块能定义函数,类和变量,模块里也能包含可执行的代码。

在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字。

模块的作用:降低工作量,常用功能封装成某个模块,使用时只需要调用模块的功能,就可以完成某些需求。

1. 导入模块

  1. import 模块名
  2. from 模块名 import 功能名(可以多个功能用逗号隔开)
  3. from 模块名 import *(*指代所有功能)

as定义别名:(只能用别名,原来的名字不能用,会报错)

  1. import 模块名 as 别名(模块定义别名)
  2. 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. 制作模块

自定义模块名必须要符合标识符命名规则。
步骤:

  1. 定义模块
  2. 测试模块
  3. 调用模块
    新建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
posted @ 2022-07-15 19:02  wakaki  阅读(91)  评论(0)    收藏  举报