为解决python上的循环依赖提供的解决方案';行不通

为解决python上的循环依赖提供的解决方案';行不通,python,python-import,circular-dependency,Python,Python Import,Circular Dependency,我正在尝试处理python上的循环依赖关系(是的,这是必要的,因为我需要在不同的文件和模块上分离模型) 我尝试了几种方法来解决这个问题(其中大多数已经通过相关问题提出),但都没有解决问题。 注意:当删除循环依赖项时,代码可以工作 延迟导入 /模块a/类a.py 从模块b.class\u b导入b A类: b=b() /模块/class_b.py B类: 从模块a.class a导入a a=a() 推迟两项进口 /模块a/类a.py A类: 从模块b类b导入b b=b() /模块/class

我正在尝试处理python上的循环依赖关系(是的,这是必要的,因为我需要在不同的文件和模块上分离模型)

我尝试了几种方法来解决这个问题(其中大多数已经通过相关问题提出),但都没有解决问题。 注意:当删除循环依赖项时,代码可以工作

  • 延迟导入

    /模块a/类a.py

    从模块b.class\u b导入b
    A类:
    b=b()
    
    /模块/class_b.py

    B类:
    从模块a.class a导入a
    a=a()
    
  • 推迟两项进口

    /模块a/类a.py

    A类:
    从模块b类b导入b
    b=b()
    
    /模块/class_b.py

    B类:
    从模块a.class a导入a
    a=a()
    
  • 不使用来自。。输入符号

    /模块a/类a.py

    将模块b.class作为mb导入
    A类:
    b=mb.b()
    
    /模块/class_b.py

    将模块a.class作为ma导入
    B类:
    a=ma.a()
    
  • 不使用来自。。带延迟导入的导入表示法

    /模块a/类a.py

    A类:
    将模块b.class作为mb导入
    b=mb.b()
    
    /模块/class_b.py

    B类:
    将模块a.class作为ma导入
    a=ma.a()
    

  • 结果是所有的解决方案都不起作用。我不知道这是否与调用是在类定义上这一事实有关,但需要这样做,因为我使用的是ORM。

    在Python中,您试图做的事情根本无法以这种方式完成。由于类定义相互依赖于另一个类的类的存在,所以没有另一个类,两个类都不能成功定义。即使在同一个文件中,这也会失败:

    A类:
    b=b()
    B类:
    a=a()
    名称错误:未定义名称“B”
    

    无论如何,循环依赖都会被考虑,并且总是可以通过使用不同的类设计来避免。考虑一个更具体的问题,如果这会给你带来麻烦,那么如何重构。

    你是否使用<代码>导入…<代码>或<代码>…导入…不相关;两者都必须导入模块,后者只需在导入后替换像
    a=module.a
    这样的赋值。“不起作用”到底是什么?我得到的要么是“ImportError:无法从'module_A.class_A'导入名称'A'”要么是“AttributeError:module'module_A.class_A'没有属性'A',将
    import
    语句放入类中(以任何一种形式)不会延迟它们。它们发生在执行
    定义时。我明白了。在这种情况下,处理不同文件上的模型之间的一对多关系的方法是什么?@DouglasRamos从它看来,您会在类中声明一个位于“多”上的外键结束,并可以选择声明一个
    相关的\u名称
    。然后,Django处理了一个神奇的功能,即能够通过一个集合访问“one”类中的“many”类,而不需要“one”类显式引用它(因此不需要导入模块)。