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字典排序实例详解
May 20 Python
Python中使用ElementTree解析XML示例
Jun 02 Python
Python实现的使用telnet登陆聊天室实例
Jun 17 Python
python获取当前用户的主目录路径方法(推荐)
Jan 12 Python
Python爬取网易云音乐上评论火爆的歌曲
Jan 19 Python
Python读取word文本操作详解
Jan 22 Python
用python处理MS Word的实例讲解
May 08 Python
详解Python学习之安装pandas
Apr 16 Python
python 子类调用父类的构造函数实例
Mar 12 Python
Python selenium使用autoIT上传附件过程详解
May 26 Python
python中出现invalid syntax报错的几种原因分析
Feb 12 Python
Python调用腾讯API实现人脸身份证比对功能
Apr 04 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/02/25 PHP
php实现的RSS生成类实例
2015/04/23 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
2016/08/12 PHP
全面解析PHP面向对象的三大特征
2017/06/10 PHP
PDO::errorCode讲解
2019/01/28 PHP
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
2007/01/29 Javascript
js textarea自动增高并隐藏滚动条
2009/12/16 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
2016/01/15 Javascript
原生js仿jquery实现对Ajax的封装
2016/10/04 Javascript
AngularJS自定义指令实现面包屑功能完整实例
2017/05/17 Javascript
浅谈Vue.js中的v-on(事件处理)
2017/09/05 Javascript
详解cordova打包成webapp的方法
2017/10/18 Javascript
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
vue-router之解决addRoutes使用遇到的坑
2020/07/19 Javascript
Vue实现购物车基本功能
2020/11/08 Javascript
javascript实现放大镜功能
2020/12/09 Javascript
Python实现的简单万年历例子分享
2014/04/25 Python
python进阶教程之函数对象(函数也是对象)
2014/08/30 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
2018/05/22 Python
解决安装pycharm后不能执行python脚本的问题
2019/01/19 Python
python开头的coding设置方法
2019/08/08 Python
如何利用pygame实现简单的五子棋游戏
2019/12/29 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
python自动生成证件号的方法示例
2021/01/14 Python
烹饪大赛策划方案
2014/05/26 职场文书
双拥工作宣传标语
2014/06/26 职场文书
化工专业求职信
2014/07/01 职场文书
中学教师暑期培训方案
2014/08/27 职场文书
员工培训协议书
2014/09/15 职场文书
教师师德表现自我评价
2015/03/05 职场文书
2015年科室工作总结
2015/04/10 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers