在其组件之一内访问 class 复合材料的正确方法是什么,如果这样做是可取的?

What is the correct way to access a class composite inside one of its components, if that's even advisable?

假设我有这两个 类:

class Branch():
    def __init__(self, id, leaves):
        self.id = id
        self.leaves = leaves
    
class Leaf():
    def __init__(self, color)
        self.color = color
    
    def describe()
        print("This leaf is " + color)

每个 Leaf 属于一个 BranchBranch 继续存在,无论它是否有任何叶子,但是 Leaf 没有 Branch 就不能有意义地存在(抛开现实生活中的逻辑)。这意味着我可以通过 Branch.leaves 属性轻松地从 Branch 中获取每个 Leaf。如果我理解正确的话,一个 Branch 是复合的,而 Branch.leaves 中的每个 Leaf 都是它的组成部分之一?

然而,没有Leaf真正知道它属于哪个Branch。所以,我不能让它打印“这片叶子是橙色的 并且属于分支 #14”。我可以添加一个 Leaf.branch 属性并在我初始化一个新的 Leaf 实例时传递它,看看 Branch 必须已经存在才能发生这种情况,但这对我来说似乎是错误的,因为看起来 Branch 属于 Leaf.

问题是:什么是最 pythonic 和正确的方法来做我描述的我在我的例子中不能做的事情?我认为感觉非常错误的事情实际上一点也不糟糕吗?或者更确切地说,这个问题是由糟糕的设计引起的,我应该从另一个角度来看这个问题吗?提前致谢。

在复杂的视图和子视图树中,每个单独的视图都有一个指向父视图和 window 的指针。在菜单项和子菜单的复杂树中,每个项目都有一个指向顶级菜单的指针。 child 知道它的 parent 或一个项目知道它的容器是很常见的。没有它,有些设计是不可能的。

在需要担心内存管理的语言中,对 parent 的引用必须是弱引用,这意味着 child 永远不必担心它的生命周期parent(反之则不然)。即使在 Python 中,parent 也拥有 child,它可以在需要时自由创建或删除,但显然,child 永远无法创建或删除其 parent(无论如何它都做不到,因为它不知道自己的容器或所有者)。

所以,两者之间有明确的等级关系objects,但这与他们能不能认识对方无关。