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 28 Python
使用Python读写及压缩和解压缩文件的示例
Jul 08 Python
Django中间件实现拦截器的方法
Jun 01 Python
使用Python编写Prometheus监控的方法
Oct 15 Python
Python程序包的构建和发布过程示例详解
Jun 09 Python
使用Python将字符串转换为格式化的日期时间字符串
Sep 01 Python
利用setuptools打包python程序的方法步骤
Jan 18 Python
Django自关联实现多级联动查询实例
May 19 Python
python不到50行代码完成了多张excel合并的实现示例
May 28 Python
keras K.function获取某层的输出操作
Jun 29 Python
如何用Matlab和Python读取Netcdf文件
Feb 19 Python
聊聊Python中关于a=[[]]*3的反思
Jun 02 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/01/07 PHP
php生成缩略图填充白边(等比缩略图方案)
2013/12/25 PHP
微信 getAccessToken方法详解及实例
2016/11/23 PHP
php从数据库中读取特定的行(实例)
2017/06/02 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
php项目中类的自动加载实例讲解
2019/09/12 PHP
js操作textarea 常用方法总结
2012/12/03 Javascript
jquery更换文章内容与改变字体大小代码
2013/09/30 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
JavaScript 基础函数_深入剖析变量和作用域
2016/05/18 Javascript
快速入门Vue
2016/12/19 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
2017/05/03 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
JavaScript变量声明var,let.const及区别浅析
2018/04/23 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
ant design vue导航菜单与路由配置操作
2020/10/28 Javascript
python下如何让web元素的生成更简单的分析
2008/07/17 Python
python设置值及NaN值处理方法
2018/07/03 Python
树莓派采用socket方式文件传输(python)
2019/06/22 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
Python从列表推导到zip()函数的5种技巧总结
2019/10/23 Python
在Python中使用filter去除列表中值为假及空字符串的例子
2019/11/18 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
Needle & Thread官网:英国仙女品牌
2018/01/13 全球购物
德国大型和小型家用电器网上商店:Energeto
2019/05/15 全球购物
美国翻新电子产品商店:The Store
2019/10/08 全球购物
失业者真诚求职信范文
2013/12/25 职场文书
实习老师离校感言
2014/02/03 职场文书
卫生标语大全
2014/06/21 职场文书
2016公司年会主持词
2015/07/01 职场文书
一文搞懂redux在react中的初步用法
2021/06/09 Javascript
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
2022/05/25 SQL Server