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中的__init__ 、__new__、__call__小结
Apr 25 Python
Python下的常用下载安装工具pip的安装方法
Nov 13 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
Jul 12 Python
Python下的Softmax回归函数的实现方法(推荐)
Jan 26 Python
Python爬取qq music中的音乐url及批量下载
Mar 23 Python
python实现统计代码行数的小工具
Sep 19 Python
Python collections中的双向队列deque简单介绍详解
Nov 04 Python
浅谈Pycharm最有必要改的几个默认设置项
Feb 14 Python
基于python实现对文件进行切分行
Apr 26 Python
Python基于Tkinter编写crc校验工具
May 06 Python
Python中openpyxl实现vlookup函数的实例
Oct 28 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 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
全国FM电台频率大全 - 22 重庆市
2020/03/11 无线电
php getsiteurl()函数
2009/09/05 PHP
php使用ICQ网关发送手机短信
2013/10/30 PHP
启用Csrf后POST数据时出现的400错误
2015/07/05 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
2017/09/28 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
2015/06/05 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
js中的事件委托或是事件代理使用详解
2017/06/23 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
vue中v-model的应用及使用详解
2018/06/27 Javascript
详解javascript函数写法大全
2019/03/25 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
ES2020 新特性(种草)
2020/01/12 Javascript
详解JavaScript编程中的window与window.screen对象
2015/10/26 Python
浅析python中的分片与截断序列
2016/08/09 Python
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
Python栈算法的实现与简单应用示例
2017/11/01 Python
30秒轻松实现TensorFlow物体检测
2018/03/14 Python
python matplotlib库绘制散点图例题解析
2019/08/10 Python
django框架创建应用操作示例
2019/09/26 Python
Python爬虫开发与项目实战
2020/12/16 Python
HTML5实现可缩放时钟代码
2017/08/28 HTML / CSS
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
选购国际女性时装设计师品牌:IFCHIC(支持中文)
2018/04/12 全球购物
Internal修饰符有什么含义
2013/07/10 面试题
实习期自我鉴定
2013/10/11 职场文书
法定代表人身份证明书(含说明)
2014/10/02 职场文书
工作失职自我检讨书
2015/05/05 职场文书
2015年纪委工作总结
2015/05/13 职场文书
vue elementUI批量上传文件
2022/04/26 Vue.js