1、什么是模块

模块就是一个.py的文件

 

2、为什么要使用模块?

最开始的程序(没有任何组织)----> 函数------>类----->模块------>包  为了让程序的组织结构更加灵活清晰,降低耦合性、方便管理;

 

3、如何使用模块

1、import:只能导入在当前目录、和内置的模块,使用模块里的内容需要 模块.来调用;

2、from...import:可以导入不是同级目录的模块,导入模块之后,可以直接调用模块里的内容;

 

3、导入模块做的3件事情

#导入模块第一件事情 创建名称空间,用来存放模块文件中定义的名字

#第二件事情基于刚刚创建的名称空间,找执行一遍模块文件里的内容  

#第三件事情spm.操作名称空间模块里的内容

 

4、模块的搜素路径

总结模块的查找顺序是:内存中已经加载的模块--------->内置模块------------>sys.path路径中包含的模块(sys.path包含当前目录)

 

二、包

1、什么是包?

包是一种通过使用‘.模块名’来组织python模块名称空间的方式。本质就一个包含__init__文件的目录

无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都是关于 包才有的导入语法

from .auth.plugins.core import create,UserAuthInfo
# 在 .(当前路径)auth(auth包).plugins(包).core(模块) import( create,UserAuthInfo)属性  .左边的都是包 最后一个可以是模块

  

 

2、使用包

import  (import包名.包名.包名.最后是模块)

 

import glance.db.models
glance.db.models.register_models('mysql') 

from (包名.包名)... import ...(import后面的是模块)

from bao.bao1 import *

如果import后面不指定一个模块名,只会执行包下的__init__文件

会执行包下的__init__文件定义的__all__=[x,y.z]的内容 

from glance.db import models
models.register_models('mysql')

from glance.db.models import register_models
register_models('mysql')

 3、包里的__init__.py文件

#在其他模块 导入import keystone包的时候,会首先执行keystone包下的__init__文件
# 如果在__init__文件导入了auth.(包)plugins.(包)core(模块) import create,UserAuthInfo(方法)
# 那么 import keystone 就可以直接执行 keystone子包下的 模块和模块里的方法了

 

 

4、绝对导入和相对导入

绝对导入:以glance 作为起始

相对导入:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内)

在glance/api/version.py

#绝对导入
from glance.cmd import manage
manage.main()

#相对导入
from ..cmd import manage
manage.main()

 

5、单独导入

#在与glance同级的test.py中
import glance
glance.cmd.manage.main()

'''
执行结果:
AttributeError: module 'glance' has no attribute 'cmd'

'''

 

posted on 2017-05-02 15:46  Martin8866  阅读(367)  评论(0编辑  收藏  举报