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

2019-02-03  本文已影响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. 软件开发规范

软件开发规范
上一篇下一篇

猜你喜欢

热点阅读