首先,我知道关于循环导入的主题已经有许多问题和答案了。
答案大体上是:“正确设计您的模块/类结构,您就不需要循环导入”。这是正确的。我为我的当前项目努力制定了一个适当的设计,在我看来我成功了。
但我的具体问题是:我需要在一个已经被包含类检查的模块中进行类型检查。但这会抛出一个导入错误。
像这样:
foo.py:
from bar import Bar
class Foo(object):
def __init__(self):
self.__bar = Bar(self)
bar.py:
from foo import Foo
class Bar(object):
def __init__(self, arg_instance_of_foo):
if not isinstance(arg_instance_of_foo, Foo):
raise TypeError()
解决方案1:如果我将其改为通过字符串比较来检查类型,它将工作。但我不太喜欢这个解决方案(对于简单的类型检查而言,字符串比较相当昂贵,并且在重构时可能会出现问题)。
bar_modified.py:
from foo import Foo
class Bar(object):
def __init__(self, arg_instance_of_foo):
if not arg_instance_of_foo.__class__.__name__ == "Foo":
raise TypeError()
解决方案2:我也可以将这两个类打包到一个模块中。但是我的项目有很多像“Bar”示例这样的不同类,我想将它们分别放在不同的模块文件中。
在我的两个解决方案都不可行之后:是否有人有更好的解决方案来解决这个问题?