【发布时间】:2017-01-20 01:53:42
【问题描述】:
我在 Stackoverflow 上看到很多帖子解释了关系之间的区别:关联、聚合、组合和继承,并附有示例。但是,我更具体地对这些方法的优缺点以及何时一种方法对手头的任务最有效感到困惑。这是我一直无法真正找到好的答案。
根据论坛的指南,我不询问为什么人们个人可能更喜欢使用继承而不是组合。我对每种方法中的任何客观好处/弱点特别感兴趣,尽管听起来很强大。 IE。一种方法是否比另一种方法创建的代码更具可读性,或者它是否具有更好的运行时效率等。
理想情况下,如果有人可以给我一些真实世界的例子,说明这些方法可能成功或失败,以及为什么,那将非常有助于发展我和我希望其他人的知识。
为了确保工作有一个坚实的基础,我在 Python 2 中包含了每个关系的示例。如果我对这些关系的理解实际上不正确,希望这可以避免混淆。
协会
B 类与 A 类具有周关联关系,因为它在 addAllNums 方法中使用来自 A 的特定属性。然而,这就是关系的程度。
class A(object):
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def addNums():
self.b + self.c
class B(object):
def __init__(self, d, e):
self.d = d
self.e = e
def addAllNums(self, Ab, Ac):
x = self.d + self.e + Ab + Ac
return x
ting = A("yo", 2, 6)
ling = B(5, 9)
print ling.addAllNums(ting.b, ting.c)
聚合
B 类与 A 类形成聚合关系,因为它在初始化时引用了一个独立的 A 对象,作为其属性之一。虽然 B 对象依赖于 A,但在 B 销毁的情况下,A 将继续存在,因为它独立于 B。
class A(object):
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def addNums():
self.b + self.c
class B(object):
def __init__(self, d, e, A):
self.d = d
self.e = e
self.A = A
def addAllNums(self):
x = self.d + self.e + self.A.b + self.A.c
return x
ting = A("yo", 2, 6)
ling = B(5, 9, ting)
print ling.addAllNums()
作曲
与聚合很像,但是 B 不是引用一个独立的对象,而是在它自己的构造函数中将 A 的一个实例初始化为一个属性。如果 B 对象被销毁,那么 A 对象也是如此。这就是为什么组合是如此紧密的关系。
class A(object):
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def addNums():
self.b + self.c
class B(object):
def __init__(self, d, e):
self.d = d
self.e = e
self.A = A("yo", 2, 6)
def addAllNums(self):
x = self.d + self.e + self.A.b + self.A.c
return x
ling = B(5, 9)
print ling.addAllNums()
我决定不包含继承的示例,因为我对它非常满意,而且我觉得包含它可能会使问题的重点有点离题。
不管上面的例子和继承有什么优缺点(相互比较)。
谢谢。
【问题讨论】:
标签: python inheritance associations aggregation composition