美文网首页
17_Python包_全栈开发学习笔记

17_Python包_全栈开发学习笔记

作者: 豆行僧 | 来源:发表于2019-02-03 15:18 被阅读0次

    1. 包的概念

    把解决一类问题的模块放在同一个文件夹里 —— 包


    2. 自行创建一个包

    范例:

    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/__init__.py','w'))
    l.append(open('glance/db/models.py','w'))
    map(lambda f:f.close() ,l)
    

    执行结果:
    生成一个glance目录
    glance目录结构:

    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)
    

    3. 注意事项

    1.关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。
    范例1:

    import glance.api.policy as policy
    policy.get()
    

    执行结果:

    from policy.py
    

    范例2:

    from glance.api import policy
    policy.get()
    

    执行结果:

    from policy.py
    

    需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法

    2.对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。

    3.对比import item 和from item import name的应用场景:
    如果我们想直接使用name那必须使用后者。


    4. _init_

    演示执行包下面的所有方法

    范例1:绝对路径
    编辑文件:

    # glance/__init__.py
    from glance import api
    from glance import cmd
    from glance import db
    
    # glance/api/__init__.py
    from glance.api import policy
    from glance.api import versions
    
    # glance/cmd/__init__.py
    from glance.cmd import manage
    
    # glance/db/__init__.py
    from glance.db import models
    
    import glance
    glance.api.policy.get()
    
    glance.db.models.register_models("mysql")
    

    执行结果:

    from policy.py
    from models.py:  mysql
    

    范例2.1:相对路径
    前提先将整个glance包移动至dir目录下
    编辑文件

    # glance/__init__.py
    from . import api
    from . import cmd
    from . import db
    
    # glance/api/__init__.py
    from . import policy
    from . import versions
    
    # glance/cmd/__init__.py
    from . import manage
    
    # glance/db/__init__.py
    from . import models
    
    from dir import glance
    glance.api.policy.get()
    

    执行结果:

    from policy.py
    

    范例2.2:相对路径_all_
    _all_是用于控制from...import *

    glance/                   
    
    ├── __init__.py     from .api import *
                        from .cmd import *
                        from .db import *    
    ├── api                  
    
    │   ├── __init__.py   __all__ = ['policy','versions'] 
    
    │   ├── policy.py
    
    │   └── versions.py
    
    ├── cmd               __all__ = ['manage']    
    
    │   ├── __init__.py
    
    │   └── manage.py    
    
    └── db                __all__ = ['models']              
    
        ├── __init__.py
    
        └── models.py
    
    
    import glance
    policy.get()
    

    4.1 绝对路径与相对路径的区别

    绝对路径:
    使用绝对路径 不管在包内部还是外部 导入了就能用
    不能挪动,但是直观

    相对路径:
    可以随意移动包 只要能找到包的位置,就可以使用包里的模块
    包里的模块如果想使用其它模块的内容只能使用相对路径,使用了相对路径就不能在包内直接执行了

    5. 软件开发规范

    软件开发规范

    相关文章

      网友评论

          本文标题:17_Python包_全栈开发学习笔记

          本文链接:https://www.haomeiwen.com/subject/ntwysqtx.html