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中的多重继承实例讲解
Sep 28 Python
Python制作爬虫抓取美女图
Jan 20 Python
浅谈编码,解码,乱码的问题
Dec 30 Python
Django验证码的生成与使用示例
May 20 Python
解决django服务器重启端口被占用的问题
Jul 26 Python
基于python框架Scrapy爬取自己的博客内容过程详解
Aug 05 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
Python守护进程实现过程详解
Feb 10 Python
Django执行源生mysql语句实现过程解析
Nov 12 Python
pymysql模块使用简介与示例
Nov 17 Python
Python实现打乒乓小游戏
Sep 25 Python
基于Python实现对比Exce的工具
Apr 07 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提交表单发送邮件的方法
2015/03/20 PHP
php版微信公众号自定义分享内容实现方法
2016/09/22 PHP
php 三大特点:封装,继承,多态
2017/02/19 PHP
php文件上传类的分享
2017/07/06 PHP
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
2010/07/24 Javascript
javascript权威指南 学习笔记之null和undefined
2011/09/25 Javascript
让低版本浏览器支持input的placeholder属性(js方法)
2013/04/03 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
jquery实现的回旋滚动效果完整实例【附demo源码下载】
2016/09/20 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
2017/04/27 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
Vue封装的组件全局注册并引用
2019/07/24 Javascript
JavaScript生成一个不重复的ID的方法示例
2019/09/16 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
详解微信小程序之提高应用速度小技巧
2020/01/07 Javascript
python编码最佳实践之总结
2016/02/14 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
2017/12/12 Python
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
使用tensorflow实现线性回归
2018/09/08 Python
django+echart绘制曲线图的方法示例
2018/11/26 Python
Python中遍历列表的方法总结
2019/06/27 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
python判断自身是否正在运行的方法
2019/08/08 Python
Python实现计算长方形面积(带参数函数demo)
2020/01/18 Python
python使用requests库爬取拉勾网招聘信息的实现
2020/11/20 Python
水利公司纪检监察自我鉴定
2014/02/25 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
五四演讲稿范文
2014/09/03 职场文书
趣味运动会赞词
2015/07/22 职场文书
小学生一年级(书信作文)
2019/08/13 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书
如何给HttpServletRequest增加消息头
2021/06/30 Java/Android