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使用marshal模块序列化实例
Sep 25 Python
python运行其他程序的实现方法
Jul 14 Python
python中join()方法介绍
Oct 11 Python
用Cython加速Python到“起飞”(推荐)
Aug 01 Python
TensorFLow 不同大小图片的TFrecords存取实例
Jan 20 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
Feb 06 Python
Django调用支付宝接口代码实例详解
Apr 04 Python
浅谈在JupyterNotebook下导入自己的模块的问题
Apr 16 Python
python math模块的基本使用教程
Jan 16 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
Mar 03 Python
Python趣味挑战之实现简易版音乐播放器
May 28 Python
python代码实现扫码关注公众号登录的实战
Nov 01 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边学边教》(02.Apache+PHP环境配置――上篇)
2006/12/13 PHP
php笔记之:php函数range() round()和list()的使用说明
2013/04/26 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
PHP中抽象类、接口的区别与选择分析
2016/03/29 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
PHP生成图片验证码功能示例
2017/01/12 PHP
拖动Html元素集合 Drag and Drop any item
2006/12/22 Javascript
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
JS将表单导出成EXCEL的实例代码
2013/11/11 Javascript
JavaScript中使用Callback控制流程介绍
2015/03/16 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
2015/11/17 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
2018/01/09 Javascript
node中实现删除目录的几种方法
2019/06/24 Javascript
微信小程序 WXML节点信息查询详解
2019/07/29 Javascript
[01:25]2015国际邀请赛最佳短片奖——斧王《拆塔英雄:天赋异禀》
2015/09/22 DOTA
Python的词法分析与语法分析
2013/05/18 Python
python查询mysql中文乱码问题
2014/11/09 Python
Python中%r和%s的详解及区别
2017/03/16 Python
python散点图实例之随机漫步
2018/08/27 Python
Python实现的在特定目录下导入模块功能分析
2019/02/11 Python
python字符串,元组,列表,字典互转代码实例详解
2020/02/14 Python
Python HTTP下载文件并显示下载进度条功能的实现
2020/04/02 Python
基于Python实现2种反转链表方法代码实例
2020/07/06 Python
Python Matplotlib绘图基础知识代码解析
2020/08/31 Python
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
大专学生推荐信范文
2013/11/19 职场文书
讲文明树新风演讲稿
2014/05/12 职场文书
卫生院艾滋病宣传活动小结
2014/07/09 职场文书
国际经济与贸易专业求职信
2014/07/10 职场文书
一文搞懂php的垃圾回收机制
2021/06/18 PHP
类和原型的设计模式之复制与委托差异
2022/07/07 Javascript