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 实现插入排序算法
Jun 05 Python
Python设计模式之工厂模式简单示例
Jan 09 Python
Python之循环结构
Jan 15 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
Apr 11 Python
Python完成哈夫曼树编码过程及原理详解
Jul 29 Python
在Python中等距取出一个数组其中n个数的实现方式
Nov 27 Python
Pytorch.nn.conv2d 过程验证方式(单,多通道卷积过程)
Jan 03 Python
Tensorflow 实现分批量读取数据
Jan 04 Python
Python通过Pillow实现图片对比
Apr 29 Python
如何安装并在pycharm使用selenium的方法
Apr 30 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
Jan 29 Python
pd.drop_duplicates删除重复行的方法实现
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
一个用于MySQL的PHP XML类
2006/10/09 PHP
phpMyAdmin 安装教程全攻略
2007/03/19 PHP
php 常用的系统函数
2017/02/07 PHP
PHP利用Socket获取网站的SSL证书与公钥
2017/06/18 PHP
层序遍历在ExtJs的TreePanel中的应用
2009/10/16 Javascript
理解Javascript_12_执行模型浅析
2010/10/18 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
js的toUpperCase方法用法实例
2015/01/27 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
JS判断时间段的实现代码
2017/06/14 Javascript
vue+axios+element ui 实现全局loading加载示例
2018/09/11 Javascript
关于Vue项目跨平台运行问题的解决方法
2018/09/18 Javascript
创建Vue项目以及引入Iview的方法示例
2018/12/03 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
2019/04/28 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
python生成随机验证码(中文验证码)示例
2014/04/03 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
Python hashlib模块用法实例分析
2018/06/12 Python
django+xadmin+djcelery实现后台管理定时任务
2018/08/14 Python
PyQt QCombobox设置行高的方法
2019/06/20 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
Python轻量级web框架bottle使用方法解析
2020/06/13 Python
python爬虫中采集中遇到的问题整理
2020/11/27 Python
What is the purpose of Void class? Void类的作用是什么?
2016/10/31 面试题
办公室文秘自我鉴定
2013/09/21 职场文书
优质的学校老师推荐信
2013/10/28 职场文书
公司廉洁自律承诺书
2014/03/27 职场文书
《新型玻璃》教学反思
2014/04/13 职场文书
助残日活动总结
2014/08/27 职场文书
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
毕业横幅标语
2014/10/08 职场文书
群众路线调研报告范文
2014/11/03 职场文书
2015年党风廉政承诺书
2015/01/22 职场文书
2016清明节森林防火广播稿
2015/12/17 职场文书