zoukankan      html  css  js  c++  java
  • python的包

    1. 把解决一类问题的模块放在同一个文件夹里,这个文件夹就是包;

    2. 通过import或是from...import导入时必须遵循一个原则:

           a> 凡是在导入时带点的,点的左边都必须是一个包,否则非法

           b> 导入后,使用时点的左边可以是包,模块,类,函数(它们都可以用点的方式调节用自己的属性);

           c> from...import导入时,import后面不能带点,否则有语法错误,如from a import b.c是错误的语法;

           d> from...import导入时,import后面可以接某个模块的一个方法,如from.glance.api.policy import get,该get是一个函数;

    3. 一个包里的各包之间的__inint__.py导入包的模块时,可以使用绝对路径和相对路径,各有优缺点:

    import os
    os.makedirs('glance/api')
    os.makedirs('glance/cmd')
    os.makedirs('glance/db')
    l = []
    l.append(open('glance/__init__.py','w'))
    l.append(open('glance/api/__init__.py','w'))
    l.append(open('glance/api/policy.py','w'))
    l.append(open('glance/api/versions.py','w'))
    l.append(open('glance/cmd/__init__.py','w'))
    l.append(open('glance/cmd/manage.py','w'))
    l.append(open('glance/db/models.py','w'))
    l.append(open('glance/db/__init__.py','w'))
    map(lambda f:f.close() ,l)
    import glance
    glance.api.policy.get()
    创建目录
    glance/                   #Top-level package
    
    ├── __init__.py      #Initialize the glance package
    
    ├── api                  #Subpackage for api
    
    │   ├── __init__.py
    
    │   ├── policy.py
    
    │   └── versions.py
    
    ├── cmd                #Subpackage for cmd
    
    │   ├── __init__.py
    
    │   └── manage.py
    
    └── db                  #Subpackage for db
    
        ├── __init__.py
    
        └── models.py
    
    目录结构
    目录结构
    #文件内容
    
    #policy.py
    def get():
        print('from policy.py')
    
    #versions.py
    def create_resource(conf):
        print('from version.py: ',conf)
    
    #manage.py
    def main():
        print('from manage.py')
    
    #models.py
    def register_models(engine):
        print('from models.py: ',engine)
    文件内容

          1> 使用绝对路径时:

                 a> 在包的内部或是包的外部,只要导入了对应包的模块(__init__.py文件),就可以使用模块的方式;

                 b> 不能挪动包到另一个目录下,因为使用的是绝对路径,挪动后绝对路径就不正确了;

                     I : 包的__init__.py文件的绝对路径的导入子包

               II: 子包的__init__.py文件的绝对路径导入模块

     

     

     

                  III: 在包glance同级目录的脚本中导入包(外部导入包),包的子包模块的方法可以正常被调用:

          执行结果:

               IIII:  在子包内部导入其他子包的模块,可以正常调试其方法:

          2> 使用相对路径时:

                 a> 可以随意挪动包,只要能找到包的位置,就可使用包里的模块方法;

                 b> 包里的模块如果想使用包的其他模块方法,首先也只能相对路径导入,而不能使用绝对路径导入;

                 c> 但是使用了相对路径,就不能在包内部直接执行,只能在包外执行方法;

                     I: 包的__init__.py文件,通过相对路径志入子包:

                       II:子包的__init__.py文件,通过相对路径导入子包模块:

                        (其它子的__init__.py文件导入模块同理:  from . import manage    from . import models)

     

       

                        III:在子包manage.py内部导入其他子包api,再调用该子包模块的方法(api.policy.get()),直接在这个子包manage.py执行脚本时会报错:

       

              IIII: 在包glance的外部,导入包,直接执行这个study.py脚本,可以让子包中的 api.policy.get() 脚本 正常被执行:

             3> 结合 __all__使用相对路径时:

                (其它子包cmd和db的__init__.py的代码为:   __all__ = ['manage']    和    __all__ = ['models'] ) 

                  

     

              调用方法,与前面的相对路径相同:

  • 相关阅读:
    facesconfig详解 Crazy
    java反射学习之一反射机制概述
    axis2开发webservice程序
    java反射学习之二万能EXCEL导出
    JMF框架
    解决FF浏览器无法执行window.close()脚本
    ava:String和Date、Timestamp之间的转换
    java获取当前路径。
    JSP 动态验证码。
    dojo.mixin
  • 原文地址:https://www.cnblogs.com/quiet-sun/p/12311555.html
Copyright © 2011-2022 走看看