Python 带继承的循环导入

Python circular imports with inheritance

我有一个父子class,其中父的方法returns是子的一个实例。两个 classes 都在单独的文件 classA.pyclassB.py 中。为了在导入 classA 时避免循环导入,我将 classB 导入添加到 classA.py 的末尾(如下所示)。一切正常,我能够在我的代码中正确使用 classA

现在,如果我只想使用 classB,就会遇到问题。例如,如果我 运行

from classB import ClassB

我收到以下错误:

File "classA.py", line 269, in <module>
    from classB import ClassB
ImportError: cannot import name ClassB

如果我运行:

from classA import ClassA
from classB import ClassB

然后一切正常,我可以同时使用两个 classes。有没有办法只导入 classB 或者我必须先导入 classA 然后再导入 classB

classA.py

class ClassA():
    def __init__(self, ...):
        ....

    def someMethod(self, ...):
        ...
        return ClassB(...)

from classB import ClassB

classB.py

from classA import ClassA

class ClassB(ClassA):
    def __init__(self, ...):
    super(ClassB, self).__init__(...)

显而易见的解决方案是将两个 类 放入同一个文件(相同的 module)。 它们紧密相关,因此非常合理,不需要 "hacks"(将导入放在文件末尾)和解决方法(导入的特殊顺序)。

同时检查这些来源:How many Python classes should I put in one file?, Is it considered Pythonic to have multiple classes defined in the same file?

您可以在 ClassA 中导入 ClassB 本地 在您使用它的地方(在 someMethod 中)

class ClassA():
    def __init__(self, ...):
        ....

    def someMethod(self, ...):
        from classB import ClassB
        ...
        return ClassB(...)

这样我就可以避免循环导入错误