码迷,mamicode.com
首页 > 编程语言 > 详细

python的包

时间:2020-02-15 18:38:11      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:ima   自己的   结构   api   结果   resource   图片   import   pac   

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‘] ) 

              技术图片

 

 技术图片

 

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

技术图片

 

python的包

标签:ima   自己的   结构   api   结果   resource   图片   import   pac   

原文地址:https://www.cnblogs.com/quiet-sun/p/12311555.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!