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
    """
        '.'代表当前目录
        优点:可以随意挪动,只要能找包,里面的模块就能正常导入
        缺点:不能在包内使用包中的其他模块,执行导入会报错
    """

       

  • 相关阅读:
    第7 章 : 应用编排与管理:Job & DaemonSet
    第6 章 : 应用编排与管理:Deployment
    第5 章 : 应用编排与管理:核心原理
    第4 章 : 理解 Pod 和容器设计模式
    第3 章 : Kubernetes 核心概念
    第2 章 : 容器基本概念
    第1 章 : 第一堂“云原生”课
    阿里云原生技术公开课程-讲师记录及视频链接
    Shell中的(),{}几种语法用法-单独总结
    折腾kubernetes各种问题汇总-<1>
  • 原文地址:https://www.cnblogs.com/zxc-Weblog/p/8298238.html
Copyright © 2011-2022 走看看