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中异常(Exception)的汇总
Jan 18 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
Apr 11 Python
Python多线程实现同步的四种方式
May 02 Python
简单实现python画圆功能
Jan 25 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
Apr 18 Python
Python对象与引用的介绍
Jan 24 Python
在Tensorflow中查看权重的实现
Jan 24 Python
Python enumerate内置库用法解析
Feb 24 Python
pyCharm 实现关闭代码检查
Jun 09 Python
python3 os进行嵌套操作的实例讲解
Nov 19 Python
Pycharm 如何一键加引号的方法步骤
Feb 05 Python
Python创建自己的加密货币的示例
Mar 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与paypal整合方法
2010/11/28 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
2015/10/20 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
PHP和MYSQL实现分页导航思路详解
2017/04/11 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
JavaScript显示当然日期和时间即年月日星期和时间
2013/10/29 Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
2015/03/31 Javascript
JavaScript代码轻松实现网页内容禁止复制(代码简单)
2015/10/23 Javascript
jquery实现点击弹出可放大居中及关闭的对话框(附demo源码下载)
2016/05/10 Javascript
JavaScript生成带有缩进的表格代码
2016/06/15 Javascript
AngularJS 执行流程详细介绍
2016/08/18 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
2017/12/19 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
使用Python中的线程进行网络编程的入门教程
2015/04/15 Python
编写Python CGI脚本的教程
2015/06/29 Python
python结合shell查询google关键词排名的实现代码
2016/02/27 Python
Python基于列表list实现的CRUD操作功能示例
2018/01/05 Python
对pandas中Series的map函数详解
2018/07/25 Python
python实现两个dict合并与计算操作示例
2019/07/01 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
django实现更改数据库某个字段以及字段段内数据
2020/03/31 Python
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
实习教师自我鉴定
2013/12/12 职场文书
粗加工管理制度
2014/02/04 职场文书
高三励志标语
2014/06/05 职场文书
2014年村支部书记四风对照检查材料思想汇报
2014/10/02 职场文书
劳模先进事迹材料
2014/12/24 职场文书
个人典型事迹材料
2014/12/30 职场文书
教师培训简讯
2015/07/20 职场文书
初中体育教学随笔
2015/08/15 职场文书
vue基于Teleport实现Modal组件
2021/05/31 Vue.js
Python Pandas读取Excel日期数据的异常处理方法
2022/02/28 Python
python内置模块之上下文管理contextlib
2022/06/14 Python