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中的引用和拷贝浅析
Nov 22 Python
Python爬虫文件下载图文教程
Dec 23 Python
python实现两张图片拼接为一张图片并保存
Jul 16 Python
python中for循环变量作用域及用法详解
Nov 05 Python
python调用接口的4种方式代码实例
Nov 19 Python
关于Numpy数据类型对象(dtype)使用详解
Nov 27 Python
python range实例用法分享
Feb 06 Python
Django自定义全局403、404、500错误页面的示例代码
Mar 08 Python
Python创建简单的神经网络实例讲解
Jan 04 Python
详解Python Celery和RabbitMQ实战教程
Jan 20 Python
Python 批量下载阴阳师网站壁纸
May 19 Python
Python中requests库的用法详解
Jun 05 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
上海无线电三厂简史修改版
2021/03/01 无线电
深入php list()函数的详解
2013/06/05 PHP
php中require和require_once的区别说明
2014/02/27 PHP
ThinkPHP中的常用查询语言汇总
2014/08/22 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
详解PHP中websocket的使用方法
2016/09/15 PHP
Javascript 刷新全集常用代码
2009/11/22 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
2013/12/31 Javascript
jquery动态添加元素事件失效问题解决方法
2014/05/23 Javascript
javascript进行四舍五入方法汇总
2014/12/16 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
js实现图片缓慢放大缩小效果
2016/08/02 Javascript
浅谈AngularJs指令之scope属性详解
2016/10/24 Javascript
domReady的实现案例
2016/11/23 Javascript
JS中实现函数return多个返回值的实例
2017/02/21 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
2019/06/10 Javascript
layer.js open 隐藏滚动条的例子
2019/09/05 Javascript
微信小程序实现下拉加载更多商品
2020/12/29 Javascript
[01:34]2014DOTA2展望TI 剑指西雅图VG战队专访
2014/06/30 DOTA
[00:52]玛尔斯技能全介绍
2019/03/06 DOTA
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
2014/08/22 Python
python实现PID算法及测试的例子
2019/08/08 Python
详解Python遍历列表时删除元素的正确做法
2021/01/07 Python
瑜伽国际:Yoga International
2018/04/18 全球购物
英国假睫毛购买网站:FalseEyelashes.co.uk
2018/05/23 全球购物
P/Invoke是什么
2015/07/31 面试题
在校生钳工实习自我鉴定
2013/09/19 职场文书
仪器仪表检测毕业生自荐信
2013/10/31 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
夫妻忠诚协议书范本
2014/11/17 职场文书
综合办公室主任岗位职责
2015/04/01 职场文书
火烧圆明园观后感
2015/06/03 职场文书
售房协议书范本
2015/08/11 职场文书
高中生综合素质评价范文
2015/08/18 职场文书
Go并发4种方法简明讲解
2022/04/06 Golang
Ruby GDBM操作简介及数据存储原理
2022/04/19 Ruby