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之总结参数的传递
Oct 10 Python
Python装饰器使用示例及实际应用例子
Mar 06 Python
python实现根据主机名字获得所有ip地址的方法
Jun 28 Python
Python中enumerate()函数编写更Pythonic的循环
Mar 06 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
Mar 22 Python
matplotlib调整子图间距,调整整体空白的方法
Aug 03 Python
用pycharm开发django项目示例代码
Oct 24 Python
python中for循环输出列表索引与对应的值方法
Nov 07 Python
实时获取Python的print输出流方法
Jan 07 Python
Python 实现的 Google 批量翻译功能
Aug 26 Python
Python Gluon参数和模块命名操作教程
Dec 18 Python
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
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
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
PHP处理会话函数大总结
2015/08/05 PHP
腾讯CMEM的PHP扩展编译安装方法
2015/09/25 PHP
学习php设计模式 php实现桥梁模式(bridge)
2015/12/07 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
网站页面自动跳转实现方法PHP、JSP(上)
2010/08/01 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
jquery 清空file域示例(兼容个浏览器)
2013/10/11 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
Highcharts使用简例及异步动态读取数据
2015/12/30 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
js的form表单提交url传参数(包含+等特殊字符)的两种解决方法
2016/05/25 Javascript
原生JS实现圣旨卷轴展开效果
2017/03/06 Javascript
Angularjs中数据绑定的实例详解
2017/08/25 Javascript
详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
2018/01/16 Javascript
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
layer ui插件显示tips时,修改字体颜色的实现方法
2019/09/11 Javascript
[40:57]TI4 循环赛第二日 iG vs EG
2014/07/11 DOTA
Python使用tablib生成excel文件的简单实现方法
2016/03/16 Python
python实现微信接口(itchat)详细介绍
2017/10/23 Python
python梯度下降法的简单示例
2018/08/31 Python
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
2019/08/27 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
业务总经理岗位职责
2014/02/03 职场文书
学校先进集体事迹材料
2014/05/31 职场文书
网络文明传播志愿者活动方案
2014/08/20 职场文书
药店促销活动策划方案
2014/08/24 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
运动会广播稿200字
2015/08/19 职场文书
小学大队干部竞选稿
2015/11/20 职场文书
2016年党员学习廉政准则心得体会
2016/01/20 职场文书
求职自荐信该如何书写?
2019/06/24 职场文书