Python程序结构-包
练习资料
包的定义
- 包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。如A.B,表示包A中的模块B。
- 采用点模块名称这种形式也不用担心不同库之间的模块重名的情况。
- 包的定义:在文件夹中放入__init__.py文件,哪怕是个空文件也可以。
从包中引入模块
设已经定义好如下包结构:
project_root/ 当前项目根目录(不用建立)
test.py 测试模块
company/ 公司包
__init__.py
department1/
__init__.py 部门包
team/ 团队包
__init__.py
project1.py 项目1模块
project2.py 项目2模块
调用方法1:绝对路径调用,import 模块文件绝对路径
- 调用的时候也必须使用模块文件的绝对路径。
用例1:使用绝对路径在test中调用模块
# team/project1模块
def info():
print(__name__)
# 在test中调用team/project1模块
# 引入模块
import company.department1.team.project1
# 调用模块中函数info()
company.department1.team.project1.info()
用例2:同一目录下2个模块间调用
# 在team/project2模块中调用team/project1模块
import company.department1.team.project1
def info():
print(__name__)
def call():
print("in project ", __name__)
print("call:")
company.department1.team.project1.info()
# 在test中调用team/project2模块
import company.department1.team.project2
# 调用模块中函数info()
company.department1.team.project2.call()
调用方法2:相对路径调用,from 包路径 import 包中具体的模块名
- 使用模块名调用函数
- 包路径可以使用绝对路径/相对路径。
用例1:使用绝对包路径
# 在test中调用team中的模块
from company.department1.team import project1
from company.department1.team import project2
# 调用模块中函数
project1.info()
project2.call()
用例2:使用相对包路径
- 相对路径指相对于当前模块所在路径
# 在team/project2中调用team/project1模块
from . import project1
def info():
print(__name__)
def call():
print("in project ", __name__)
print("call:")
project1.info()
# 在test中调用team/project2中的模块
from company.department1.team import project2
# 调用模块中函数
project2.call()
调用方法3:更底层的调用,调用模块中的数据或者方法, from 模块路径 import 数据或者方法
- 直接导入一个函数或者变量,可以直接使用该函数或者变量
- 可以使用绝对路径/相对路径。
- 这样做的前提是当前模块中的函数与引入的函数没有相同的定义。
用例1:
# 在team/project2中调用team/project1模块
# 引入模块
from company.department1.team.project1 import info
# 调用模块中函数
info()
包配置文件__init__.py
2个作用:
- 包标识
- 模糊导入
- 注:既然是python文件,当然也可以写代码,但不建议。
包中模块的模糊导入__all__
- 和from package import *搭配使用,定义该包中默认导入的模块。
调用方法4:包中模块的模糊导入
- 在包含模块文件的包的__init__.py文件中定义__all__=[‘模块1’,‘模块2’,......]
- 使用from 包路径 import *
# 在team的__init__.py文件中添加
__all__=['project1', 'project2']
# 在test中调用team中的所有模块
# 引入模块
from company.department1.team import *
# 调用模块中函数
project1.info()
project2.call()
其他【可选】:
包绝对路径:__path__
用例:
# 在test模块中
# 引入模块
import company
from company.department import team1
# 打印引入的包的绝对路径
print(team1.__path__)
print(company.__path__)
输出:
['U:\Project\Python_Training\Pytho_Basic\company\department\team1']
['U:\Project\Python_Training\Pytho_Basic\company']