python - 如何在 Python 3.7+ 中定义循环依赖的数据类?

标签 python python-3.x circular-dependency python-dataclasses

假设class A有一个成员类型是class Bclass B有一个成员类型是class A.

在 Scala 或 Kotlin 中,在这种情况下,您可以按任何顺序定义类而无需担心,因为第一个定义的类可以像往常一样使用第二个定义的类,即使在案例/数据类中也是如此。

然而在Python中,如下代码

class A:
    b = B()

class B:
    a = A()     

抛出编译错误,因为在定义 class A 时未定义 class B

您可以解决这个简单的问题,例如 this answer

class A:
    pass

class B:
    a = A()

A.b = B()

但是,这种方式不适用于 Python 中的数据类,因为在数据类定义之后分配成员不会更新数据类的自动生成方法,这使得“数据类”的用法无用。

@dataclass
class A:
    b: B  # or `b: Optional[B]`

@dataclass
class B:
    a: A  # or `a: Optional[A]`

如何避免这个问题?

最佳答案

有几种方法可以解决像这样的循环依赖,参见Type hints: solve circular dependency

您始终可以手动应用装饰器(并更新注释),如@Nearoo 的回答显示。

但是,“前向声明”该类可能更容易:

class A:
    pass

@dataclass
class B:
    a: A

@dataclass
class A:
    b: B

或者简单地使用前向引用:

@dataclass
class B:
    a: 'A'

@dataclass
class A:
    b: B

最干净的是import Python 4.0's behavior (如果可以的话):

from __future__ import annotations

@dataclass
class B:
    a: A

@dataclass
class A:
    b: B

关于python - 如何在 Python 3.7+ 中定义循环依赖的数据类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52676647/

相关文章:

python - 在 64 位 Windows 中安装 Twain 模块并使用 Python

python - 如何找到哪些单元格无法转换为 float ?

typescript - Typescript、CommonJS 和 Browserify 的循环依赖问题

c++ - 解决由于类之间的循环依赖导致的构建错误

c++ - 循环依赖和 std::vector::insert

python - A[1 :3][0:2] and A[1:3, 0:2] 之间的区别

python - 遍历列表时如何删除元素

python - TKinter:如何动态更改帧宽度

python - 这是遗传算法吗?

python - 如何获取数组中某个范围内或高于阈值的值的计数?