2

假设我有这两个类:

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属于一个Branch。无论ABranch是否有叶子,它都会继续存在,但如果Leaf没有 a,a 就无法有意义地存在Branch(抛开现实生活中的逻辑不谈)。这意味着我可以通过属性轻松地Leaf从 a中获取每一个。如果我正确理解了组合,a是组合并且每个in都是它的组成部分之一?BranchBranch.leavesBranchLeafBranch.leaves

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

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

4

1 回答 1

1

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

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

因此,这两个对象之间存在明确的层次关系,但这与它们是否可以相互认识无关。

于 2021-01-18T18:49:24.680 回答