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的设计模式编程入门指南
Apr 02 Python
Python 实现数据库(SQL)更新脚本的生成方法
Jul 09 Python
python负载均衡的简单实现方法
Feb 04 Python
如何用Python来搭建一个简单的推荐系统
Aug 07 Python
Python利用PyExecJS库执行JS函数的案例分析
Dec 18 Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 Python
python实现飞机大战游戏(pygame版)
Oct 26 Python
Python class的继承方法代码实例
Feb 14 Python
Django ORM filter() 的运用详解
May 14 Python
Python模拟登入的N种方式(建议收藏)
May 31 Python
opencv之颜色过滤只留下图片中的红色区域操作
Jun 05 Python
python通过新建环境安装tfx的问题
May 20 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
海河写的 Discuz论坛帖子调用js的php代码
2007/08/23 PHP
Zend Studio 无法启动的问题解决方法
2008/12/04 PHP
PHP插入排序实现代码
2013/04/04 PHP
php实现数组按指定KEY排序的方法
2015/03/30 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
2015/01/29 Javascript
javascript文本框内输入文字倒计数的方法
2015/02/24 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
js中获取时间new Date()的全面介绍
2016/06/20 Javascript
AngularJS Bootstrap详细介绍及实例代码
2016/07/28 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
2017/09/25 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
搭建Vue从Vue-cli到router路由护卫的实现
2019/11/14 Javascript
js将URL网址转为16进制加密与解密函数
2020/03/04 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
2020/04/08 Javascript
Element Card 卡片的具体使用
2020/07/26 Javascript
解决python 输出是省略号的问题
2018/04/19 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
python excel和yaml文件的读取封装
2021/01/12 Python
英国露营设备和户外服装购物网站:Simply Hike
2019/05/05 全球购物
数学检讨书1000字
2014/02/24 职场文书
专项资金申请报告
2015/05/15 职场文书
小兵张嘎观后感
2015/06/03 职场文书
Python基础之元组与文件知识总结
2021/05/19 Python
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server
VUE递归树形实现多级列表
2022/07/15 Vue.js
python 镜像环境搭建总结
2022/09/23 Python