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

       

  • 相关阅读:
    2017/09/02笔记:ps
    207/08/3学习笔记:pc端网站如何实现移动端适配知识点
    2017/0828xueix笔记:图像替代文本&css绘制的图形
    20170824:面试题笔记
    目前比较全的CSS重设(reset)方法总结
    学习笔记:css3实现多行文字溢出显示省略号&display:box;
    SVG圆形<circle> 标签
    k8s节点分配nodeSelector, Affinity和Anti-Affinity 亲和性和反亲和性
    kubernetes网络介绍
    centos6.7 安装docker
  • 原文地址:https://www.cnblogs.com/zxc-Weblog/p/8298238.html
Copyright © 2011-2022 走看看