day*_*ill 10 python inheritance associations composition aggregation
我在Stackoverflow上看到很多帖子解释了关系之间的区别:关联,聚合,组合和继承,以及示例.但是,我更加特别地混淆了每种方法的优缺点,并且当一种方法对于手头的任务最有效时.这是我无法真正找到一个好答案的东西.
与论坛的指导方针保持一致,我不是要问为什么人们可能会个人更喜欢使用继承而不是构图.我对每种方法中的任何客观利益/弱点都特别感兴趣,这听起来有点强烈.即,一种方法创建比另一种更可读的代码,或者它具有更好的运行时效率等.
理想情况下,如果有人可以给我一些真实世界的例子,这些方法可能已成功或失败,为什么,这对于发展我和我希望的其他知识非常有用.
为了确保一个可靠的基础,我已经在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)
Run Code Online (Sandbox Code Playgroud)
聚合
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()
Run Code Online (Sandbox Code Playgroud)
组成
就像聚合一样,B而不是引用一个独立的对象,实际上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()
Run Code Online (Sandbox Code Playgroud)
我决定不再包含一个继承的例子,因为我对它完全满意,而且我觉得它的包含可能会使问题的一点点切断.
无论如何,上面的例子和继承的优点和缺点是什么(相互比较).
谢谢.
小智 0
我个人的观点是,您应该首先考虑如何对现实世界数据进行建模,以帮助您解决特定的现实世界问题。将事物分配给类、描述类和/或实例之间的关系、描述事物的属性等是困难的部分:正确处理这些,代码中的模式(无论是继承、聚合、子类化等)都会变得很容易。例如:
正方形和长方形有什么关系?可逆矩阵是方阵的子类吗?死牛是哺乳动物吗?学生是人的子类吗?老师是子类吗?那么TA们呢?