Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果';这是明智的吗?_Python_Python 3.x_Class_Object Composition - Fatal编程技术网

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()
方法。我要补充的是,如果没有分支就不能存在一个叶,那么分支可能应该负责初始化叶。感谢所有的评论,我现在有了一个更清晰的方向。我的实际项目比这更复杂,但您的解决方案仍然适用。