小肥羊要进步

Python程序结构-包

Python程序结构-包
 
练习资料
PACKAGE.rar
 
 
包的定义
  • 包是一种管理 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']
 
 
 
 
 
 
 
 
 
 
 
 

 
 

posted on 2020-10-18 16:03  小肥羊要进步  阅读(272)  评论(0编辑  收藏  举报

导航