python 模块相互import
[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内部会分成几个步骤:
- 在sys.modules中查找符号”B”
- 果符号B存在,则获得符号B对应的module对象<module B>。
从<module B>的__dict__中获得符号”D”对应的对象,如果”D”不存在,则抛出异常
如果符号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相关推荐
- python模块相互引用_python导入模块交叉引用的方法
实际项目中遇到python模块相互引用问题,查资料,终于算是弄明白了. 首先交叉引用或是相互引用,实际上就是导入循环,关于导入循环的详细说明,可见我摘自<python核心编程>第二版的摘抄 ...
- 21 Python模块、import语句、搜索路径、变量、命名空间和作用域、dir函数、globals()和locals()函数、reload()函数、Python中的包
21Python模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python ...
- python模块相互引用_python中如何相互引用两个包中的模块
包名为New_Start #!/usr/bin/python #-*- encoding: utf-8 -*- ''' Created on 2014年10月11日 @author : Adminis ...
- 【Python】学习笔记总结4(Python模块)
文章目录 四.Python模块 1.import导入模块 2.from...import导入模块 3.as 给模块取别名 4. os模块 5.自行编写模块 四.Python模块 1.import导入模 ...
- python android 扩展库,Python模块进阶、标准库、扩展库
模块进阶 Python有一套很有用的标准库(standard library).标准库会随着Python解释器,一起安装在你的电脑中的. 它是Python的一个组成部分.这些标准库是Python为你准 ...
- Newspaper 一个能下载 38 种语言新闻文章的 Python 模块
这是「进击的Coder」的第 485 篇技术分享 作者:Ckend 来源:Python 实用宝典 " 阅读本文大概需要 7 分钟. " Newspaper 是一个很棒的 pytho ...
- python基础之import模块导入和包的调用
模块概念 在Python中,一个.py文件就称之为一个模块(Module).使用模块组织代码,最大的好处是大大提高了代码的可维护性 模块一共三种:python标准库.第三方模块.应用程序自定义模块. ...
- Python模块之间的相互引用问题
在某次运行过程中出现了如下两个报错: 报错1: ModuleNotFoundError: No module named '__main__.src_test1'; '__main__' is not ...
- python模块--如何相互调用自己写的模块
一.模块相互调用同级目录调用时的两种方法 1 import module 2 print(module.add(3,8)) 3 4 from module import add 5 print(add ...
- [ 转]Python模块(二)import和from...import的区别
Python模块(二)import和from...import的区别 听语音 原创 | 浏览:2975 | 更新:2018-04-02 13:02 | 标签:PYTHON 1 2 3 4 5 6 7 ...
最新文章
- 配置文件application.properties剥离
- 【年终总结】有三AI至今在人脸图像算法领域都分享了哪些内容?
- session-cookie 和token登录验证
- js中如果无法获取某个html属性,例如自定义了一个dir属性,但获取总是为空,尝试换个词,因为可能什么关键词冲突了。...
- 怎么知道wx.config执行成功没_作为一个减肥40斤,且10年没反弹的普通人,这份瘦身经验分享给你...
- 介词for和with 和of的用法_英语中的for,to,at,of,in,on,with的用法
- 重磅!GitLab 在中国成立公司极狐,GitHub 还会远吗?
- 大数据背景下的互联网金融应用领域
- Extjs 实战之 Ext.tree.TreePanel Tree无法显示
- java中的getnumber怎么用_java安全编码指南之:Number操作详解
- [Java] HttpClient有个古怪的stalecheck选项
- 从高的角度看自动化测试
- 国家开放大学2021春1078复变函数题目
- webuploader横向按钮样式
- 数据结构与算法之PHP排序算法(桶排序)
- Proguard混淆器
- oracle自定义异常长度,Oracle自定义异常收集(二)
- python 概率分布函数_逆累积分布函数,累积分布函数及python实现
- 海马玩安卓模拟器linux,Droid4X 0.8.4 海马玩安卓模拟器 安卓的福音
- TMMi连接传统与敏捷--2017中国首届TMMi国际峰会在京圆满举行
热门文章
- Mac CAD2018 安装完成后,打开注册机时出现 应用程序“02_注册机”不能打开。
- PROE 齿轮设计视频教程+直齿 斜齿 人字齿 内外啮齿 行星齿
- win版石器和linux,石器时代私服架设教程Linux版
- MySQL(密码恢复及设置)
- 计算机房的正常温度和湿度,机房的温度、湿度标准值是多少?
- 17-【istio】-【流量管理】-【流量管理案例篇】针对TCP流量
- win10无法装载重装系统iso文件_Win10系统如何装载和弹出ISO镜像文件?
- java orb 是什么_什么是ORB
- 使用计算机时要注意防,计算机使用的几个基本技巧
- iphone查看python文件_通过python获取苹果手机备份文件中的照片,视频等信息采集...