gpt4 book ai didi

python - 如何实例化相互依赖的类?

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:17 26 4
gpt4 key购买 nike

我有一个 PlayoffCreator 类来创建季后赛比赛。该类有一个 Bracket 实例,它生成括号的结构,该结构中的每个匹配都是一个 Node,由类 Element 的两个实例组成

然后,PlayoffCreator 遍历Bracket 拥有的每个Node 并对其进行处理,创建匹配并执行其他必要的操作。处理 Node 时,两个 Element 都会被处理:这个 Element 类有多个子类,每个子类都定义不同的 process() 行为。

问题是 Node 是通过传递两个 Element 来实例化的:

class Node:
def __init__(self, bracket, home_element, away_element):
pass

但是 Element 也可以通过传递 Node 来实例化,因为 process() 方法作用于 中找到的数据BracketPlayoffCreator,均可通过 Node 访问。

class Element:
def __init__(self, node):
pass

通常如何处理这种对实例化问题的循环依赖?

最佳答案

我看到两种可能性。

1 - 实例化两个元素,然后设置依赖项

class A:
def __init__(self):
self.b = None

class B:
def __init__(self):
self.a = None

a = A()
b = B()
a.b = b
b.a = a

您可以通过在 A 的构造函数中添加一个 b 可选参数(默认为 None)来进一步插入这一点,并执行相同的操作对于B:

class A:
def __init__(self, b=None):
self.b = b

class B:
def __init__(self, a=None):
self.a = a

这允许您通过传递第一个实例来实例化第二个:

a = A()
b = B(a)
a.b = b

2 - 在 A 实例化时实例化 B,然后获取该实例

class A:
def __init__(self):
self.b = B(self)

class B:
def __init__(self, a):
self.a = a

a = A()
b = a.b
<小时/>

这两种方法都有其优点和缺点。我更喜欢 n°1,因为它更灵活,因为对称。但是,如果两个类之间存在逻辑层次结构,则也可以使用 n°2。

关于python - 如何实例化相互依赖的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44884497/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com