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

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. 软件开发规范

软件开发规范
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 模块和包 一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是...
    go以恒阅读 2,306评论 0 4
  • 目录: 上一节课生成器还有一些知识点没讲到,接下来补充; 一、协程函数 生成器:yield关键字的另外一种用法yi...
    CaiGuangyin阅读 643评论 0 1
  • 车子颤动几下,就启动了。整个车厢所有的笼子里都哼哼响起来,不过,都被汽车发动机的声音盖过了。 自从出生开始,我就住...
    燃星阅读 422评论 3 7
  • 今天穿的裙子有点透,感觉被办公室的男同事视j了一天
    04ed5f07243b阅读 130评论 0 0
  • 1 1994年上映的《东邪西毒》放在今天算是一部比较“老”的电影。作为一个“90后”,我错过了它的黄金时期。但时隔...
    风未冷阅读 729评论 5 14