Python新手如何理解循环加载模块


Posted in Python onMay 29, 2020

循环加载模块

假设你有两个文件,a.py和b.py,在这两个文件中互相加载对方,例如:

在a.py中:

import b
def f():
return b.x
print f()

在b.py中:

import a
x = 1
def g():
print a.f()

首先,我们试着加载a.py:

>>> import a
1

没有问题。也许让人吃惊,毕竟有个感觉应该是问题的循环加载在这儿。

事实上在Python中仅仅是表面上的出现循环加载并不是什么问题。如果一个模块以及被加载了,Python不会傻到再去重新加载一遍。但是,当每个模块都想要互相访问定义在对方里的函数或者变量时,问题就来了。

让我们再回到之前的例子,当我们加载a.py时,它再加载b.py不会有问题,因为在加载b.py时,它并不需要访问a.py的任何东西,而在b.py中唯一的引用就是调用a.f()。但是这个调用是在函数g()中完成的,并且a.py或者b.py中没有人调用g(),所以这会儿心情还是美丽的。

但是当我们试图加载b.py时(之前没有加载a.py),会发生什么呢:

>>> import b
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "b.py", line 1, in <module>
  import a
   File "a.py", line 6, in <module>
  print f()
   File "a.py", line 4, in f
  return b.x
AttributeError: 'module' object has no attribute 'x'

恭喜你,出错了。这里问题出在加载b.py的过程中,Python试图加载a.py,并且在a.py中需要调用到f(),而函数f()又要访问到b.x,但是这个时候b.x却还没有被定义。这就产生了AttributeError异常。

解决的方案可以做一点细微的改动。改一下b.py,使得它在g()里面加载a.py:

x = 1
def g():
  import a  
# 只有当g()被调用的时候才加载
  print a.f()

这会儿当我们加载b.py的时候,一切安好:

>>> import b
>>> b.g()
1  
# 第一次输出,因为模块a在最后调用了‘print f()'
1  
# 第二次输出,这是我们调用g()

知识点扩充:

1、使用系统函数__import_()

stringmodule = __import__('string')

2、使用imp 模块

import imp
stringmodule = imp.load_module('string',*imp.find_module('string'))

3、使用exec

import_string = "import string as stringmodule"
exec import_string

到此这篇关于Python新手如何理解循环加载模块的文章就介绍到这了,更多相关Python循环加载模块详解内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python用来获得图片exif信息的库实例分析
Mar 16 Python
python实现线程池的方法
Jun 30 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
Python编程求解二叉树中和为某一值的路径代码示例
Jan 04 Python
python计算两个数的百分比方法
Jun 29 Python
Python 操作 ElasticSearch的完整代码
Aug 04 Python
python django 原生sql 获取数据的例子
Aug 14 Python
如何使用python3获取当前路径及os.path.dirname的使用
Dec 13 Python
pandas中ix的使用详细讲解
Mar 09 Python
Python requests模块cookie实例解析
Apr 14 Python
Python3 搭建Qt5 环境的方法示例
Jul 16 Python
python 实现一个简单的线性回归案例
Dec 17 Python
Python新手如何进行闭包时绑定变量操作
May 29 #Python
如何理解python中数字列表
May 29 #Python
Django实现前台上传并显示图片功能
May 29 #Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
May 29 #Python
Django实现后台上传并显示图片功能
May 29 #Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
May 29 #Python
Python基于smtplib模块发送邮件代码实例
May 29 #Python
You might like
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
php版本的cron定时任务执行器使用实例
2014/08/19 PHP
php生成图片缩略图的方法
2015/04/07 PHP
php实现window平台的checkdnsrr函数
2015/05/27 PHP
jQuery实战之品牌展示列表效果
2011/04/10 Javascript
打印json对象的内容及JSON.stringify函数应用
2013/03/29 Javascript
javascript截取字符串小结
2015/04/28 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
2016/06/08 Javascript
JS实现复制内容到剪贴板功能
2017/02/05 Javascript
使用Vue完成一个简单的todolist的方法
2017/12/01 Javascript
通过fastclick源码分析彻底解决tap“点透”
2017/12/24 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
mapboxgl实现带箭头轨迹线的代码
2021/01/04 Javascript
Python脚本实现网卡流量监控
2015/02/14 Python
用Python编写简单的定时器的方法
2015/05/02 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
让Python更加充分的使用Sqlite3
2017/12/11 Python
python编写分类决策树的代码
2017/12/21 Python
TensorFlow搭建神经网络最佳实践
2018/03/09 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
2019/07/04 Python
python产生模拟数据faker库的使用详解
2020/11/04 Python
用html5绘制折线图的实例代码
2016/03/25 HTML / CSS
小程序canvas中文字设置居中锚点
2019/04/16 HTML / CSS
关于iframe跨域使用postMessage的实现
2019/10/29 HTML / CSS
苹果中国官方网站:Apple中国
2016/07/22 全球购物
美国电视购物HSN官网:HSN
2016/09/07 全球购物
Linux管理员面试题 Linux admin interview questions
2016/07/08 面试题
大学生村官事迹材料
2014/01/21 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
委托证明范本
2014/11/25 职场文书
2015年社区矫正工作总结
2015/04/21 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书
Python加密与解密模块hashlib与hmac
2022/06/05 Python
详解Anyscript开发指南绕过typescript类型检查
2022/09/23 Javascript