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 Matplotlib库入门指南
May 18 Python
Python实现周期性抓取网页内容的方法
Nov 04 Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
Jun 29 Python
python对日志进行处理的实例代码
Oct 06 Python
对json字符串与python字符串的不同之处详解
Dec 19 Python
python用类实现文章敏感词的过滤方法示例
Oct 27 Python
使用Python内置模块与函数进行不同进制的数的转换
Apr 26 Python
python多进程下的生产者和消费者模型
May 07 Python
matplotlib基础绘图命令之bar的使用方法
Aug 13 Python
python matplotlib库的基本使用
Sep 23 Python
Python re.sub 反向引用的实现
Jul 07 Python
Python经常使用的一些内置函数
Apr 11 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 采集程序 常用函数
2008/12/18 PHP
PHP+memcache实现消息队列案例分享
2014/05/21 PHP
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
javascript基础第一章 JavaScript与用户端
2010/07/22 Javascript
js获取客户端操作系统类型的方法【测试可用】
2016/05/27 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
2016/06/29 Javascript
关于不同页面之间实现参数传递的几种方式讨论
2017/02/13 Javascript
Vuejs 用$emit与$on来进行兄弟组件之间的数据传输通信
2017/02/23 Javascript
JavaScript中object和Object的区别(详解)
2017/02/27 Javascript
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
简述vue中的config配置
2018/01/23 Javascript
Vue.js中的组件系统
2019/05/30 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
[58:54]EG vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
[43:53]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.22
2019/09/05 DOTA
详解python3实现的web端json通信协议
2016/12/29 Python
python+opencv识别图片中的圆形
2020/03/25 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
Python读取实时数据流示例
2019/12/02 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
django 装饰器 检测登录状态操作
2020/07/02 Python
python 生成正态分布数据,并绘图和解析
2020/12/21 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
css3实现顶部社会化分享按钮示例
2014/05/06 HTML / CSS
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
优秀团员个人的自我评价
2013/10/02 职场文书
信息技术教学反思
2014/02/12 职场文书
聚美优品的广告词
2014/03/14 职场文书
学校三节实施方案
2014/06/09 职场文书
关键在于落实心得体会
2014/09/03 职场文书
出租房屋协议书
2014/09/14 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
2014年工程部工作总结
2014/11/25 职场文书
文案策划岗位职责
2015/02/11 职场文书
我的收音机情缘
2022/04/05 无线电
未发现nvidia显卡怎么办?Win11系统中未检测到nvidia显卡解决教程
2022/04/08 数码科技