Python新手如何理解循环加载模块
作者:爱喝马黛茶的安东尼 时间:2022-10-09 00:12:53
循环加载模块
假设你有两个文件,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
来源:https://www.py.cn/jishu/jichu/10532.html
标签:Python,循环加载
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
几行代码轻松实现PHP文件打包下载zip
2024-06-05 09:47:49
画好线框图的20个步骤
2009-09-01 19:46:00
python中isdigit() isalpha()用于判断字符串的类型问题
2023-05-02 18:52:48
Python实现数值积分方式
2022-01-23 14:00:37
![](https://img.aspxhome.com/file/2023/2/126982_0s.jpg)
Python 的矩阵传播机制Broadcasting和矩阵运算
2021-07-28 01:03:34
![](https://img.aspxhome.com/file/2023/6/97186_0s.png)
js实现通过开始结束控制的计时器
2024-04-18 09:39:03
WAP中的ASP技术
2008-05-18 13:30:00
Python解决两个整数相除只得到整数部分的实例
2021-12-29 23:29:21
Vue插槽原理与用法详解
2024-05-09 10:43:09
![](https://img.aspxhome.com/file/2023/3/126623_0s.png)
Python生成可执行文件之PyInstaller库的使用方式
2021-11-29 00:41:49
![](https://img.aspxhome.com/file/2023/5/121685_0s.png)
Python 实现王者荣耀中的敏感词过滤示例
2023-08-14 01:21:04
golang goquery selector选择器使用示例大全
2023-10-14 15:40:58
Python中三个不可思议的返回功能分享
2021-11-21 07:32:41
php引用计数器进行垃圾收集机制介绍
2023-10-07 22:41:55
sql server实现递归查询的方法示例
2024-01-23 00:57:17
python3.x 生成3维随机数组实例
2021-04-11 04:02:43
![](https://img.aspxhome.com/file/2023/5/128195_0s.jpg)
jupyter notebook读取/导出文件/图片实例
2022-01-05 00:28:45
![](https://img.aspxhome.com/file/2023/7/102347_0s.jpg)
python循环监控远程端口的方法
2023-08-07 14:53:22
pip更新问题的解决:'python -m pip install --upgrade pip' 报错问题(最新推荐)
2023-04-23 04:32:13
![](https://img.aspxhome.com/file/2023/8/105028_0s.png)
用Python做的数学四则运算_算术口算练习程序(后添加减乘除)
2023-04-10 13:27:35