模块A中import B,而在模块B中import A。这时会怎么样呢?这个在Python列表中由RobertChen给出了详细解释,抄录如下:

[A.py]
from B import D
class C:pass  [B.py]
from A import C
class D:pass

为什么执行A的时候不能加载D呢?

如果将A.py改为:import B就可以了。

这是怎么回事呢?

RobertChen:这跟Python内部import的机制是有关的,具体到from B import D,Python内部会分成几个步骤:

  1. 在sys.modules中查找符号”B”
  2. 果符号B存在,则获得符号B对应的module对象<module B>。

    从<module B>的__dict__中获得符号”D”对应的对象,如果”D”不存在,则抛出异常

  3. 如果符号B不存在,则创建一个新的module对象<module B>,注意,这时,module对象的__dict__为空。

    执行B.py中的表达式,填充<module B>的__dict__ 。

    从<module B>的__dict__中获得”D”对应的对象,如果”D”不存在,则抛出异常。

所以,这个例子的执行顺序如下:

1、执行A.py中的from B import D

由于是执行的python A.py,所以在sys.modules中并没有<moduleB>存在,首先为B.py创建一个module对象(<moduleB>),注意,这时创建的这个module对象是空的,里边啥也没有,在Python内部创建了这个module对象之后,就会解析执行B.py,其目的是填充<module B>这个dict。

2、执行B.py中的from A import C

在执行B.py的过程中,会碰到这一句,首先检查sys.modules这个module缓存中是否已经存在<moduleA>了,由于这时缓存还没有缓存<moduleA>,所以类似的,Python内部会为A.py创建一个module对象(<moduleA>),然后,同样地,执行A.py中的语句。

3、再次执行A.py中的from B import D

这时,由于在第1步时,创建的<moduleB>对象已经缓存在了sys.modules中,所以直接就得到了<moduleB>,但是,注意,从整个过程来看,我们知道,这时<moduleB>还是一个空的对象,里面啥也没有,所以从这个module中获得符号”D”的操作就会抛出异常。如果这里只是importB,由于”B”这个符号在sys.modules中已经存在,所以是不会抛出异常的。

上面的解释已经由Zoom.Quiet收录在啄木鸟了,里面有图,可以参考一下:

python 模块相互import相关推荐

  1. python模块相互引用_python导入模块交叉引用的方法

    实际项目中遇到python模块相互引用问题,查资料,终于算是弄明白了. 首先交叉引用或是相互引用,实际上就是导入循环,关于导入循环的详细说明,可见我摘自<python核心编程>第二版的摘抄 ...

  2. 21 Python模块、import语句、搜索路径、变量、命名空间和作用域、dir函数、globals()和locals()函数、reload()函数、Python中的包

    21Python模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python ...

  3. python模块相互引用_python中如何相互引用两个包中的模块

    包名为New_Start #!/usr/bin/python #-*- encoding: utf-8 -*- ''' Created on 2014年10月11日 @author : Adminis ...

  4. 【Python】学习笔记总结4(Python模块)

    文章目录 四.Python模块 1.import导入模块 2.from...import导入模块 3.as 给模块取别名 4. os模块 5.自行编写模块 四.Python模块 1.import导入模 ...

  5. python android 扩展库,Python模块进阶、标准库、扩展库

    模块进阶 Python有一套很有用的标准库(standard library).标准库会随着Python解释器,一起安装在你的电脑中的. 它是Python的一个组成部分.这些标准库是Python为你准 ...

  6. Newspaper 一个能下载 38 种语言新闻文章的 Python 模块

    这是「进击的Coder」的第 485 篇技术分享 作者:Ckend 来源:Python 实用宝典 " 阅读本文大概需要 7 分钟. " Newspaper 是一个很棒的 pytho ...

  7. python基础之import模块导入和包的调用

    模块概念 在Python中,一个.py文件就称之为一个模块(Module).使用模块组织代码,最大的好处是大大提高了代码的可维护性 模块一共三种:python标准库.第三方模块.应用程序自定义模块. ...

  8. Python模块之间的相互引用问题

    在某次运行过程中出现了如下两个报错: 报错1: ModuleNotFoundError: No module named '__main__.src_test1'; '__main__' is not ...

  9. python模块--如何相互调用自己写的模块

    一.模块相互调用同级目录调用时的两种方法 1 import module 2 print(module.add(3,8)) 3 4 from module import add 5 print(add ...

  10. [ 转]Python模块(二)import和from...import的区别

    Python模块(二)import和from...import的区别 听语音 原创 | 浏览:2975 | 更新:2018-04-02 13:02 | 标签:PYTHON 1 2 3 4 5 6 7 ...

最新文章

  1. 配置文件application.properties剥离
  2. 【年终总结】有三AI至今在人脸图像算法领域都分享了哪些内容?
  3. session-cookie 和token登录验证
  4. js中如果无法获取某个html属性,例如自定义了一个dir属性,但获取总是为空,尝试换个词,因为可能什么关键词冲突了。...
  5. 怎么知道wx.config执行成功没_作为一个减肥40斤,且10年没反弹的普通人,这份瘦身经验分享给你...
  6. 介词for和with 和of的用法_英语中的for,to,at,of,in,on,with的用法
  7. 重磅!GitLab 在中国成立公司极狐,GitHub 还会远吗?
  8. 大数据背景下的互联网金融应用领域
  9. Extjs 实战之 Ext.tree.TreePanel Tree无法显示
  10. java中的getnumber怎么用_java安全编码指南之:Number操作详解
  11. [Java] HttpClient有个古怪的stalecheck选项
  12. 从高的角度看自动化测试
  13. 国家开放大学2021春1078复变函数题目
  14. webuploader横向按钮样式
  15. 数据结构与算法之PHP排序算法(桶排序)
  16. Proguard混淆器
  17. oracle自定义异常长度,Oracle自定义异常收集(二)
  18. python 概率分布函数_逆累积分布函数,累积分布函数及python实现
  19. 海马玩安卓模拟器linux,Droid4X 0.8.4 海马玩安卓模拟器 安卓的福音
  20. TMMi连接传统与敏捷--2017中国首届TMMi国际峰会在京圆满举行

热门文章

  1. Mac CAD2018 安装完成后,打开注册机时出现 应用程序“02_注册机”不能打开。
  2. PROE 齿轮设计视频教程+直齿 斜齿 人字齿 内外啮齿 行星齿
  3. win版石器和linux,石器时代私服架设教程Linux版
  4. MySQL(密码恢复及设置)
  5. 计算机房的正常温度和湿度,机房的温度、湿度标准值是多少?
  6. 17-【istio】-【流量管理】-【流量管理案例篇】针对TCP流量
  7. win10无法装载重装系统iso文件_Win10系统如何装载和弹出ISO镜像文件?
  8. java orb 是什么_什么是ORB
  9. 使用计算机时要注意防,计算机使用的几个基本技巧
  10. iphone查看python文件_通过python获取苹果手机备份文件中的照片,视频等信息采集...