python __import__和import区别,Python中的import
1.导入实际上是python虚拟机把当前的globals()和locals()传入_ _ builds _ _。__import__内置函数,所以实际上是_ _ import _ _函数起作用!
2.导入对命名空间的影响
1)如果是python的内置模块,比如os模块。这些模块是在python虚拟机启动时加载的,但并不公开。我们可以通过dir()命令查看当前的名称空间。
目录()
[__builtins__ , __doc__ , __name__]
如你所见,你看不到像os和sys这样的模块。
但是如果我们执行import sys,我们就会得到它。
导入系统
目录()
[__builtins__ , __doc__ , __name__ , sys]
通过字典sys.modules(键:模块名;值:模块的路径),我们可以查看模块的信息。通过id函数,我们可以知道这两个sys模块是否是同一个模块,如下:
id(系统)
135708788
id(sys.modules[sys])
135708788
2)导入只影响当前模块的名称空间
比如a.py里有导入bb,bb.py里有导入os,可以这样看。
导入a
目录()
[__builtins__ , __doc__ , __name__ , a]
导演(a)
[__builtins__ , __doc__ , __file__ , __name__ , bb]
总监(a.bb)
[__builtins__ , __doc__ , __file__ , __name__ , os]
3.导入包
第一个合法软件包必须包含__init__。py文件,包可以包含0个或多个模块(py文件)。假设aa文件夹下有test.py文件和bb文件夹,bb文件夹下有c.py。那么导入aa.bb.c时,对命名空间有什么影响呢?
导入aa.bb.c
目录()
[__builtins__ , __doc__ , __name__ , aa]
导入系统
对于sys.modules.items()中的k,v:
.打印k, \t ,v
.
嗜酒者互诫协会
复制注册
__main__
位置
__内置_ _
编码
编码.编码无
aa.bb.c
posixpath
全局变量
编码.编解码器无
编码. latin_1
os.path
_编解码器
斯达
zipimport
警告信息
编码.类型无
户词典
[计]系统复制命令(system的简写)
编解码器
阅读线
类型
_类型
信号
线缓存
可移植性操作系统接口
编码.别名
aa.bb
例外
骨
可以看到只是import aa.bb.c的一句话,但是所有的aa,aa.bb,aabb.c都加到了当前的命名空间。这是为了防止重名,因为如果不加前缀,其他包中重名的模块是无法识别的!原理是python现在在当前命名空间中寻找符号 aa 对应的对象,然后在其命名空间中寻找符号 bb ,再在bb的属性(命名空间)中寻找C。所以AA和bb都要装。但是,这些只加载一次。不信可以试试导入aa.bb.d之类的模块,提前在aa文件夹里。
在__init__中输入print‘hello’。py文件。只有第一次导入aa.bb.c时才会输出Hello!
4 .来源和进口
1)例如:从aa导入bb
从aa进口bb
目录()
[__builtins__ , __doc__ , __name__ , bb]
导入系统
sys.modules[bb]
回溯(最近一次呼叫):
文件“”中的第1行
关键错误:“bb”
sys.modules[aa.bb]
bb
aa.bb
回溯(最近一次呼叫):
文件“”中的第1行
名称错误:未定义名称“aa”
From import只是将导入后的名称引入到命名空间中,方便我们使用,但实际上里面是有模块名称的。进口.作为.事实也是如此。
2)从2005年开始.导入*
不推荐这种形式的导入,因为容易污染命名空间。但是你也可以发现。
首先,如果文件__init__。包中的py没有声明__all__的值,从包*中导入是没有用的。因为python源代码中的import_from_all函数估计会读取__all__的值然后导入。
这种形式的导入如何影响名称空间?
答案和进口aa.bb.c一样.
一个
顶端
0
踩
共享给:
2009-10-12 21:50
浏览16306
评论
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。