Python 如果';这是明智的吗?
假设我有两个类:Python 如果';这是明智的吗?,python,python-3.x,class,object-composition,Python,Python 3.x,Class,Object Composition,假设我有两个类: 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 "
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)
每个叶
都属于一个分支
。无论是否有叶子,分支
都会继续存在,但是如果没有分支(撇开现实生活的逻辑不谈,叶子
就不能有意义地存在。这意味着我可以通过Branch.leaves
属性从Branch
轻松获取每个Leaf
。如果我理解正确的话,一个分支
是复合的,而分支中的每个叶子
。叶子
是它的一个组成部分
然而,没有一个
Leaf
真正知道它属于哪个分支。所以,我不能让它打印“这片叶子是橙色的,属于14号树枝”。我可以添加一个Leaf.branch
属性,并在初始化一个新的Leaf
实例时传递它,看看branch
必须已经存在才能发生这种情况,但这对我来说似乎是非常错误的,因为这样看来分支
属于Leaf
问题是:做我在示例中描述的我不能做的事情,最具python风格和正确的方法是什么?我觉得很不对劲的是不是真的很糟糕?或者更确切地说,这个问题是由糟糕的设计引起的,我应该从另一个角度来看这个问题吗?提前感谢。在复杂的视图和子视图树中,每个视图都有一个指向超级视图和窗口的指针。在菜单项和子菜单的复杂树中,每个项都有指向顶部菜单的指针。孩子了解其父项或项目了解其容器是很常见的。没有这一点,有些设计是不可能的
在需要担心内存管理的语言中,对父对象的引用必须是弱引用,这意味着子对象永远不必担心其父对象的生命周期(反之亦然)。即使在Python中,父级也拥有子级,在需要时可以自由创建或删除子级,但显然,子级永远不能创建或删除其父级(因为它不知道自己的容器或所有者,所以无论如何都不能创建或删除父级)
因此,这两个对象之间有一个明确的层次关系,但这与它们可以或不可以相互了解这一事实无关。“但我觉得这似乎是非常错误的”这不是真的,尽管它通常不是最好的设计,它引入了非常紧密的耦合,但是,如果你需要一片叶子来访问它的分支,这几乎是必要的。在这种情况下是可以接受的。一个规范的数据结构,双链表,就是这样工作的。所以它不一定是“坏的”。实际上,您的用例是一个图/树,所以这一点也不是闻所未闻的。如果叶子需要知道它们属于哪个分支,我认为给它们一个分支属性并不坏。不过,它可能不属于叶的init。从语义上讲,当一个叶被分配给分支时,分支最好添加这个。您可以在分支的init中执行此操作,或者在分支上有一个执行此操作的add_leaf()
方法。我要补充的是,如果没有分支就不能存在一个叶,那么分支可能应该负责初始化叶。感谢所有的评论,我现在有了一个更清晰的方向。我的实际项目比这更复杂,但您的解决方案仍然适用。