文件死锁导致 ImportError :cannot import name xxx解决方法

复现文件死锁导致 导入类报错的场景:

这里以工厂设计模式为例子:

# 例子目录
--pakege
 -- __init__.py
 -- factory.py
 -- facotry1.py
 -- factory2.py

factory 文件内容如下:

from abc import ABC,abstractmenthod
from .factory1 import CarFactory
from .factory2 import PlainFactory
class Factory(ABC):
 	@staticmethod
    def create_instance(name):
    	if name=='car':
    		return CarFactory().product()
    	else:
    		return PlainFactory().product()
    
    @abstractmethod
    def product(self):
    	pass

if __name__=='__main__':
	Factory.create_instance('car')

facotry1 文件内容如下:

from factory import Factory

class CarFactory(Factory):
	
	def product(self):
		print('汽车生产工厂')

factory2 文件内容如下:

from factory import Factory

class PlainFactory(Factory):
	
	def product(self):
		print('飞机生产工厂')

当我们执行factory.py文件的时候,就会报错 ImportError :cannot import name CarFactory

原因:当我们执行factory.py文件的时候,执行到这一句的时候,from .factory1 import CarFactory,程序会跳到factory1文件,factory1.py文件会执行from factory import Factory,又会跳到factory.py文件,factory.py文件执行到第二行,又会跳到factory1文件中,导致最终进入死循环,也就是文件死锁。

解决方法:可以将两个工厂类放在静态方法导入,这样导入抽象工厂类的时候就不会执行工厂类的导入,也就不会造成文件死锁

from abc import ABC,abstractmenthod

class Factory(ABC):
 	@staticmethod
    def create_instance(name):
    	# 放这里 工厂类factory1和2导入抽象工厂类的时候,就不会执行这两句,只有调用该静态方法才会执行工厂类的导入。
        from .factory1 import CarFactory
        from .factory2 import PlainFactory
    	if name=='car':
    		return CarFactory().product()
    	else:
    		return PlainFactory().product()
    
    @abstractmethod
    def product(self):
    	pass

if __name__=='__main__':
	Factory.create_instance('car')
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值