如何实例化彼此依赖的类?

时间:2017-07-03 11:33:34

标签: python python-2.7 oop

我有一个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()方法会对BracketPlayoffCreator中找到的数据起作用,通过Node

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

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

1 个答案:

答案 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。