【发布时间】:2014-01-17 19:43:36
【问题描述】:
我正在使用 Python 中的两个类,其中一个应该被允许将来自另一个类的任意数量的对象作为子级,同时将这些子级的清单作为一个属性。对于这种父子情况,继承似乎是显而易见的选择,但我所得到的是组合的一个例子。这是简化的代码:
class Parent:
def __init__(self, firstname, lastname):
self.firstname = firstname
self.lastname = lastname
self.kids = []
def havechild(self, firstname):
print(self.firstname, "is having a child")
self.kids.append(Child(self, firstname))
class Child(Parent):
def __init__(self, parent, firstname):
self.parent = parent
self.firstname = firstname
self.lastname = parent.lastname
所以基本上,虽然让 Child() 从 Parent() 继承似乎是直观的,但删除继承并不会改变任何东西。我可以看到离开 Child(Parent) 而不仅仅是 class Child() 的唯一好处是,如果我需要向 Parent 我希望 Child 继承。使用 self.parent = parent,我已经可以访问 Parent 的任何其他未来属性。
除了将Parent 实例传递给Child 构造函数(组合)之外,还有其他方法可以使用纯继承吗?
【问题讨论】:
-
不,你做对了。通过继承引入对象之间的耦合只是为了在它们之间共享方法是很糟糕的,除非您希望它们具有“is a”,即使那样,您也可能想转而采用“mixin”路线。
-
继承用于“is-a”关系。孩子是父母吗?不必要。组合是为了“有”的关系。孩子有父母(父母有孩子)。如果你有一个人类,你会使用继承,那么一个孩子就是一个人,所以孩子会从人继承。
-
如果您需要两个类共享一些通用方法,那么您总是可以从一个 Person 类继承这两个类。
-
“父母”或“孩子”是“人”有时碰巧拥有或不拥有的偶然属性。因此,在这种命名法的情况下,您应该只有一个类 -
Person,其kids数组是否为空。 -
如果您希望您的孩子能够拥有child(...),您可能需要继承。
标签: python inheritance composition