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,循环加载
0
投稿

猜你喜欢

  • 几行代码轻松实现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
  • Python 的矩阵传播机制Broadcasting和矩阵运算

    2021-07-28 01:03:34
  • 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
  • Python生成可执行文件之PyInstaller库的使用方式

    2021-11-29 00:41:49
  • 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
  • jupyter notebook读取/导出文件/图片实例

    2022-01-05 00:28:45
  • python循环监控远程端口的方法

    2023-08-07 14:53:22
  • pip更新问题的解决:'python -m pip install --upgrade pip' 报错问题(最新推荐)

    2023-04-23 04:32:13
  • 用Python做的数学四则运算_算术口算练习程序(后添加减乘除)

    2023-04-10 13:27:35
  • asp之家 网络编程 m.aspxhome.com