在其组件之一内访问 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
属于一个 Branch
。 Branch
继续存在,无论它是否有任何叶子,但是 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,但这与他们能不能认识对方无关。
假设我有这两个 类:
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
。 Branch
继续存在,无论它是否有任何叶子,但是 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,但这与他们能不能认识对方无关。