目录
模块的定义与分类
模块是什么?
一个函数封装一个功能,一个模块就是一个py文件,这个py文件里面存储这很多公共的功能。一个模块就是由多个功能(函数或类)组成的一个py文件。
一个真正的后端项目可能会有几十万行代码,不可能都放在一个py文件中,我们要分文件、分目录开发,比如我们分了10py文件,构建一个大项目。
为什么要使用模块?
- 拿来主义。避免重复造轮子,减少代码的重复使用,提升开发效率。
- 让我们项目文件组织结构更清晰,方便管理。
模块的分类
python中的模块分三类。
- 标准库,内置模块。(time, os 等等)我们下载python解释器自带的模块,200多种模块。
- 第三方库。通过pip install这个命令安装的就是第三方库。6000多种。
- 自定义模块。我们自己构建的,一般是服务于项目。
我们自己定义个模块,供下面的知识点学习使用。
print('from the tbjx.py')
name = '太白金星'
def read1():
print('tbjx模块:',name)
def read2():
print('tbjx模块')
read1()
def change():
global name
name = 'barry'
import导入模块
import模块发生三件事情
import引入,导入的意思。
import taibaijinxing
import taibaijinxing
import taibaijinxing
import taibaijinxing
import taibaijinxing
import taibaijinxing
import一次模块,会执行此模块里面的所有的代码,如果在引入此模块,则不会重复执行。但是这个代码会一直加载到内存。
引入一个模块会发生三件事:
import taibaijinxing
# print(taibaijinxing.name)
taibaijinxing.read1()
- 会在内存中创建一个以此模块名命名的全局名称空间。
- 执行此模块中的代码,将所有代码加载到此空间中。
- 通过模块名点的方式调用此模块中的所有的名字(变量,函数名,类名)。
被导入的模块有独立的名称空间
import taibaijinxing
# name = 'barry'
# print(taibaijinxing.name)
def read1():
print(' in import read1')
def read2():
print(' in import read2')
taibaijinxing.read2()
为模块起别名
方便使用。
比如我们现在的模块名taibaijinxing 太长了.
import taibaijinxing as tb print(tb.name)
导入多个模块
import time
import os
import taibaijinxing
from … Import …导入模块
3.1 简单使用
from taibaijinxing import name, read1
print(name)
通过from这种引用,我们可以直接使用引用的变量。
import 与from import对比
- from import 方式 比直接import用起来更加简便。
- from import方式容易与本空间的变量起冲突。
# 测试一
from taibaijinxing import name
# print(name)
# name = 'barry'
# print(name)
# name = 'barry'
# from taibaijinxing import name
# print(name)
# 被引用的模块有独立的空间,引用的read2函数是模块空间的,找寻read1函数时,从模块空间找。
# 测试二
from taibaijinxing import read1, read2
def read1():
print('in from import read1')
# read1()
read2() # taibaijinxing read2 函数
# 测试三
from taibaijinxing import change
name = '姚聪'
change()
print(name)
from import 起别名
from taibaijinxing import change as ca
一行导入多个名字
# 通过from import的方式,可以使用一行代码导入多个名字。
from taibaijinxing import name, read1, read2, change
*
获取所有名字
from taibaijinxing import *
print(name)
read1()
read2()
我们尽量不要使用※,如果你非要使用※,那么一般都要与__all__
配合使用。
from taibaijinxing import *
print(name)
read1()
read2()
# change()
# taibaijinxing 模块中:
print('from the tbjx.py')
__all__ = ['name', 'read1'] # 控制*的取值范围。
name = '太白金星'
def read1():
print('tbjx模块:', name)
def read2():
print('tbjx模块')
read1()
def change():
global name
name = 'barry'
print('in change')
py文件的两种功能
python中的py文件是有两种角色的:
- 脚本。一个py文件完成了一个功能(内部管理系统,购物车),并且是主动执行的称之为脚本。
- 模块。一个py文件里面有很多公共的功能,并且是被其他py文件引用的。
非常重要的语法:
if __name__ == '__main__':
关键节点在于__name__方法:这个方法可以判断此py文件是脚本,还是模块。
如果一个py文件是脚本: __name__ == '__main__'
如果一个py文件是模块: __name__ == '模块名'
if __name__ == '__main__'有两个作用:
- 在模块中测试某些模块的功能。
print('from the tbjx.py') __all__ = ['name', 'read1'] name = '太白金星' def read1(): print('tbjx模块:', name) def read2(): print('tbjx模块') read1() def change(): global name name = 'barry' print('in change') # print(__name__) # '__main__' if __name__ == '__main__': change()
- 用于项目的启动文件使用。
模块的搜索路径
我们引用一个模块,有的是可以引用到的,有的是默认不能引用的。
我们引用一个模块,是有一个顺序的,import或者from … import这两个命令一执行,他先会从内存中寻找有没有该模块的名称空间,内存中没有从内置模块中找,如果内置模块在没有,它会从sys.path这个里面寻找。
内存 -----> 内置模块 -------> sys.path
sys.path是什么?sys是python中的一个模块,在运行python程序前,sys默认会将指定的某些目录加载到内存中,这些指定的目录就在sys.path这个列表中。
import sys # print(sys.path) # 如何引用day22/tbjx.py这个模块? sys.path.append('/Users/barry/PycharmProjects/蒲公英四期/day22') import tbjx print(tbjx.name)