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获得图片base64编码示例
Jan 16 Python
python同时给两个收件人发送邮件的方法
Apr 30 Python
python登录豆瓣并发帖的方法
Jul 08 Python
Python黑帽编程 3.4 跨越VLAN详解
Sep 28 Python
Python中第三方库Requests库的高级用法详解
Mar 12 Python
numpy 计算两个数组重复程度的方法
Nov 07 Python
python gensim使用word2vec词向量处理中文语料的方法
Jul 05 Python
Pandas实现dataframe和np.array的相互转换
Nov 30 Python
Python计算机视觉里的IOU计算实例
Jan 17 Python
python中round函数如何使用
Jun 19 Python
Pytest测试框架基本使用方法详解
Nov 25 Python
学会Python数据可视化必须尝试这7个库
Jun 16 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
CURL状态码列表(详细)
2013/06/27 PHP
利用浏览器的Javascript控制台调试PHP程序
2014/01/08 PHP
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
2014/07/28 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
PHP中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
2013/08/06 Javascript
jquery二级导航内容均分的原理及实现
2013/08/13 Javascript
JS中图片缓冲loading技术的实例代码
2013/08/29 Javascript
JavaScript获取表单内所有元素值的方法
2015/04/02 Javascript
js禁止页面刷新与后退的方法
2015/06/08 Javascript
详解javascript中原始数据类型Null和Undefined
2015/12/17 Javascript
jQuery文件上传控件 Uploadify 详解
2016/06/20 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
angularjs 表单密码验证自定义指令实现代码
2016/10/27 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
微信小程序利用button控制条件标签的变量问题
2020/03/15 Javascript
基于vuex实现购物车功能
2021/01/10 Vue.js
Python生成器(Generator)详解
2015/04/13 Python
python负载均衡的简单实现方法
2018/02/04 Python
python使用装饰器作日志处理的方法
2019/07/11 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
Jupyter notebook如何实现指定浏览器打开
2020/05/13 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
python UIAutomator2使用超详细教程
2021/02/19 Python
浅析CSS3 中的 transition,transform,translate之间区别和作用
2020/03/26 HTML / CSS
有机婴儿毛毯和衣服:Monica + Andy
2020/03/01 全球购物
个人自我鉴定
2013/11/07 职场文书
公司门卫岗位职责范本
2014/07/08 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
教导处教学工作总结
2015/08/12 职场文书
一文搞懂MySQL索引页结构
2022/02/28 MySQL