复现文件死锁导致 导入类报错的场景:
这里以工厂设计模式为例子:
# 例子目录
--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')