前言
在python的模块有两种组织方式,一种是单纯的python文件,文件名就是模块名,一种是包,包是一个包含了若干python文件的目录,目录下必须有一个文件__init__.py
,这样目录名字就是模块名,包里的python文件也可以通过包名.文件名的方式import
import语法
import语法有两种
1、直接import模块
import Module import Module as xx
2、从模块import对象(下级模块,类,函数,变量等)
from Module import Name from Module immport Name as yy
as语法是用来设置对象(这里用对象泛指模块,类,函数等等)别名,import将对象名字引入了当前文件的名字空间
假设有如下目录结构
├── A.py└── pkg ├── B.py └── __init__.py
在当前目录下,以下语句都是有效的
import A import pkgimport pkg.Bfrom pkg import B
为了简化讨论,下面将不会对as语法进行举例
import步骤
python所有加载的模块信息都存放在sys.modules结构中,当import一个模块时,会按如下步骤来进行
sys.modules
中是否已经有A,如果有则不加载,如果没有则为A创建module对象,并加载A 如果是from A import B,先为A创建module对象,再解析A,从中寻找B并填充到A的__dict__
中嵌套import
在import模块时我们可能会担心一个模块会不会被import多次,假设有A,B,C三个模块,A需要import B和C,B又要import C,这样A会执行到两次import C,一次是自己本身import,一次是在import B时执行的import,但根据上面讲到的import步骤,在第二次import时发现模块已经被加载,所以不会重复import
但如下情况却会报错
#filename: A.pyfrom B import BBclass AA:pass#filename: B.pyfrom A import AAclass BB:pass
这时不管是执行A.py还是B.py都会抛出ImportError的异常,假设我们执行的是A.py,究其原因如下
from A import AA
,此时又会去扫描A.py 扫描A.py第一行执行from B import BB
,由于步骤1已经为B创建module对象,所以会直接从B的module对象的__dict__
中获取BB,此时显然BB是获取不到的,于是抛出异常解决这种情况有两种办法,
总之,import需要注意的是,尽量在需要用到时再import
包的import
当一个目录下有
新闻热点
疑难解答