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' '''