zoukankan      html  css  js  c++  java
  • python模块之包

      包:将解决一类问题的模块放在同一目录下就形成了一个包

      为了更好的了解包,我们就模拟创建一个包

    import os
    
    os.makedirs('glance/api')
    os.makedirs('glance/cmd')
    os.makedirs('glance/db')
    lis = [open('glance/__init__.py', 'w'), 
             open('glance/api/__init__.py', 'w'),     
             open('glance/api/policy.py', 'w'),
             open('glance/api/versions.py', 'w'), 
             open('glance/cmd/__init__.py', 'w'), 
             open('glance/cmd/manage.py', 'w'),
             open('glance/db/__init__.py', 'w'), 
             open('glance/db/models.py', 'w')]
    map(lambda f: f.close(), lis)    

      我们创建的那些'.py'文件就相当于一个个模块,可以在里面写一个简单的函数,用作测试。

      包中模块的导入

    # 通过包名.目录.模块名 将包内部的模块导入
    import glance.api.policy as policy
    policy.get()

      __init__.py文件的作用

    # 每个包下面都要有一个__init__.py文件 导入包时,就会执行这个文件
    f = open('glance/__init__.py', 'w', encoding='utf-8')
    f.write("print('this is glance/__init__.py')")
    f.close()
    import glance  # 打印this is glance/__init__.py

      因此在我们自己创建一个包时,就可以利用__init__.py在完成内层的导入工作。

    """
        因此可以通过在__init__.py文件提前写好包的下一层的导入代码
            from glance import api
            from glance import cmd
            from glance import db
    """
    f = open('glance/api/__init__.py', 'w', encoding='utf-8')
    f.write("print('this is glance/api/__init__.py')")
    f.close()
    # 执行了from glance import api 进而执行了api下的__init__.py
    import glance  # 打印this is glance/api/__init__.py
    
    # 在api下的__init__.py写好 from glance.api import policy
    import glance
    glance.api.policy.get()  # 打印from policy.py
    """
        通过这种提前在__init__.py文件中写好下一层所有内容的导入代码的方式
        只需要import包名就可以导入下面的所有模块
    """

      一般有两种导入方式:绝对路径导入和相对路径导入

      1,绝对路径导入

    # 绝对路径导入  在__init__.py文件中写导入代码时,使用绝对路径,如:from glance.api import policy
    """
        优点:导入后,不管在包内部还是外部都可以使用,并且直观。
        缺点:不能挪动,不然就会找不对路径
    """

      2,相对路径导入

    # 相对路径导入 在__init__.py文件中写导入代码时,使用相对路径,如:from . import policy
    """
        '.'代表当前目录
        优点:可以随意挪动,只要能找包,里面的模块就能正常导入
        缺点:不能在包内使用包中的其他模块,执行导入会报错
    """

       

  • 相关阅读:
    Java学习笔记之——封装
    Java学习笔记之——String和Arrays常用方法
    Flask+uwsgi+virtualenv环境配置
    shell常用函数封装-main.sh
    APK模式下,epg版本升级,需要做同步
    cboss升级顺序
    Mariadb使用xtrabackup工具备份数据脚本
    Seaweedfs-启动脚本
    运营商-工作内容调整记录
    MSC服务器-主从检测脚本-check_server_state.sh
  • 原文地址:https://www.cnblogs.com/zxc-Weblog/p/8298238.html
Copyright © 2011-2022 走看看