• 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']
     
     
     
     
     
     
     
     
     
     
     
     

     
     
  • 相关阅读:
    关于树状数组区间最值
    Gym 100500B
    RQNOJ Bus
    关于加权的LIS问题
    vs tip1
    小常识
    我的魔方主力
    killer驱动
    从日升的mecha anime看mecha genre的衰退
    关于供给移动端的视频压制
  • 原文地址:https://www.cnblogs.com/JacquelineQA/p/13835695.html
Copyright © 2020-2023  润新知