假设class A
有一个成员类型是class B
,class 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/