Python 面向对象编程 五(结束)组合
Python 面向对象编程 五(结束)组合
- 组合
组合
组合是面向对象编程中另一个流行的概念,它与封装也有一定关系。简单地说,组成是指在一个对象中包含一个或多个对象,从而形成一个真实世界的对象。包含其他类对象的类称为复合类,复合类中包含对象的类称为组件类。在下面的代码中,我们展示了一个复合类的示例,它有三个组件类对象,分别是 A、B 和 C:
组合被认为是继承的另一种方法。这两种设计方法都旨在建立对象之间的关系。在继承的情况下,对象是紧耦合的,因为父类中的任何更改都可能破坏子类中的代码。另一方面,在组合的情况下,对象是松散耦合的,这有助于在一个类中进行更改,而不会破坏另一个类中的代码。由于其灵活性,合成方法相当受欢迎,但这并不意味着它是每个问题的正确选择。那么,我们如何确定使用哪一个来解决哪个问题呢?这有一个经验法则。当我们在对象之间建立关系时,继承是正确的选择-例如,汽车是一种车辆,猫是一种动物。在继承的情况下,子类是父类的扩展,具有额外的功能和重用父类功能的能力。如果物体之间的关系是一个物体有另一个物体,那么最好使用成分–例如,汽车有电池。如果不能肯定两个类之间存在“是一种”的关系,那么应该用组合(或聚合)来代替继承。
聚合是一个和组合类似的概念。组合是一种更强的聚合。组合是物理包容,在 UML 中用实心菱形表示。聚合是按引用包容,在 UML 中用空心菱形表示。选择聚合通常是分析或架构设计时决定的;选择组合通常是具体的、战术上的事情。
我们将使用前面的小汽车类
类和发动机类
类的示例。在多重继承的示例代码中,我们将小汽车类
类实现为发机机类
类的子类,这实际上并不是继承的好用例。现在是使用组合的时候了——在小汽车类
类中使用发动机类
类对象。我们还可以为轮子
创建另一个类,将它包含在小汽车类
类中。
我们将在以下示例中进一步说明组合:
class 轮子类:
def __init__(我, 形状):
我.形状 = 形状
def __str__(我):
return f"轮子形状:{我.形状}"
class 发动机类:
def __init__(我, 排量):
我.排量 = 排量
def __str__(我):
return f"发动机排量:{我.排量}"
class 小汽车类:
def __init__(我, 颜色, 发动机排量, 轮子形状):
我.颜色 = 颜色
我.发动机 = 发动机类(发动机排量)
我.轮子 = 轮子类(轮子形状)
def 输出_我(我):
print(f"我是一只小汽车,颜色是{我.颜色},{我.发动机}, {我.轮子}。")
if __name__ == "__main__":
小汽车 = 小汽车类("白色", "100L", "正方形")
小汽车.输出_我()
以上代码输出结果是:
我是一只小汽车,颜色是白色,发动机排量:100L, 轮子形状:正方形。
可以看到,在这个例子中,一个小汽车有一个正方形轮子和一个发动机,所以要用组合。小汽车不是一种发动机,也不是一种轮子,所以不能用继承。
<结束>