Python——面向对象(7)--- 模块的循环导入

本文探讨了Python中模块循环导入的问题及其危害,通过一个实例展示了循环导入导致的死循环,并提出了三种避免循环导入的方法:重构代码结构、将导入语句置于函数体内或放到模块末尾。
摘要由CSDN通过智能技术生成

首先需要明白:循环导入是一种错误的方式!!!

1.模块的循环导入:

在大型的python项目中,需要很多python文件,由于架构不当,可能会出现模块之间的相互导入。
A :模块
def test():
f()
B :模块
def f():
test()

2.一个循环导入的例子:-----------------

# 1. 文件object5.py中代码
from object5_2 import func

def task1():
    print('--task1---')


def task2():
    print('--task2---')
    func()码片

# 2. 文件object5_5.py中代码
from object5 import task1

def func():
    task1()
    print('循环导入_2中的task1')

# 运行文件object5.py的时候就会出错:
# Traceback (most recent call last):
#   File "D:/Python/code/mainxiangobject/object5.py", line 11, in <module>
#     from object5_2 import func
#   File "D:\Python\code\mainxiangobject\object5_2.py", line 1, in <module>
#     from object5 import task1
#   File "D:\Python\code\mainxiangobject\object5.py", line 11, in <module>
#     from object5_2 import func
# ImportError: cannot import name 'func'

出错原因:
在执行object5.py的时候,首先执行from object5_2 import func
这样去到object5_5.py中,又开始执行from object5 import task1
这样再去到object5.py…
如此,就造成了死循环。。。
-----这就是模块的循环导入问题

# 修改1:--------------------
# 1. 文件object5.py中代码
from object5_2 import func

def task1():
    print('--task1---')


def task2():
    print('--task2---')
    func()

# 2. 文件object5_5.py中代码
# def func():
#     from object5 import task1
#     task1()
#     print('循环导入_2中的task1')


task1()
task2()

# --task1---
# --task2---
# --task1---
# --task2---
# --task1---
# 循环导入_2中的task1
# --task1---
# 循环导入_2中的task1

这样看打印的内容有些多,
这是由于每次导入的时候就会加载一遍函数内的内容

# 修改2:--------------------
# 在“修改1”的基础上,将task1(),task2()放在主函数里面
# 这样在被导入该模块的时候,就只会调用相关函数,就不再会加载本文件本身的执行内容
if __name__=='__main__':
    task1()
    task2()
# --task1---
# --task2---
# --task1---
# 循环导入_2中的task1

3.避免产生循环导入的方式:

1.重新架构
2.将导入的语句放入函数体里面
3.把导入语句放在模块最后

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值