我有一个PlayoffCreator
课程来创建季后赛比赛。此类有一个Bracket
实例,用于生成括号的结构,此结构中的每个匹配都是Node
,由类Element
的两个实例组成。
然后PlayoffCreator
遍历Node
所拥有的Bracket
并处理它,创建匹配并执行其他必要的操作。处理Node
时,会处理两个Element
:此Element
类有多个子类,每个都定义了不同的process()
行为。
问题是通过传递两个Node
来实例化Element
:
class Node:
def __init__(self, bracket, home_element, away_element):
pass
但Element
也会通过传递Node
来实例化,因为process()
方法会对Bracket
和PlayoffCreator
中找到的数据起作用,通过Node
。
class Element:
def __init__(self, node):
pass
通常如何处理这种对实例化问题的循环依赖?
答案 0 :(得分:1)
我看到两种可能性。
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
您可以在b
的构造函数中添加A
可选参数,默认为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 - 在B
实例化时实例化A
,然后获取该实例
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。