当前位置: 首页 > article >正文

Python 面向对象编程 五(结束)组合

Python 面向对象编程 五(结束)组合

    • 组合

组合

组合是面向对象编程中另一个流行的概念,它与封装也有一定关系。简单地说,组成是指在一个对象中包含一个或多个对象,从而形成一个真实世界的对象。包含其他类对象的类称为复合类,复合类中包含对象的类称为组件类。在下面的代码中,我们展示了一个复合类的示例,它有三个组件类对象,分别是 A、B 和 C:

有一个
1
1
有一个或多个
1
1..n
有零个或多个
1
0..n
组合类
组件类1
组件类2
组件类3

组合被认为是继承的另一种方法。这两种设计方法都旨在建立对象之间的关系。在继承的情况下,对象是紧耦合的,因为父类中的任何更改都可能破坏子类中的代码。另一方面,在组合的情况下,对象是松散耦合的,这有助于在一个类中进行更改,而不会破坏另一个类中的代码。由于其灵活性,合成方法相当受欢迎,但这并不意味着它是每个问题的正确选择。那么,我们如何确定使用哪一个来解决哪个问题呢?这有一个经验法则。当我们在对象之间建立关系时,继承是正确的选择-例如,汽车是一种车辆,猫是一种动物。在继承的情况下,子类是父类的扩展,具有额外的功能和重用父类功能的能力。如果物体之间的关系是一个物体有另一个物体,那么最好使用成分–例如,汽车有电池。如果不能肯定两个类之间存在“是一种”的关系,那么应该用组合(或聚合)来代替继承。

聚合是一个和组合类似的概念。组合是一种更强的聚合。组合是物理包容,在 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, 轮子形状:正方形。

可以看到,在这个例子中,一个小汽车有一个正方形轮子和一个发动机,所以要用组合。小汽车不是一种发动机,也不是一种轮子,所以不能用继承。

<结束>


http://www.kler.cn/a/450454.html

相关文章:

  • 嵌入式设备常用性能和内存调试指令
  • 如何完全剔除对Eureka的依赖,报错Cannot execute request on any known server
  • 初学stm32 --- 定时器中断
  • 第十四章 C++ 数字
  • 【前端】入门指南:Vue中使用Node.js进行数据库CRUD操作的详细步骤
  • ajax中get和post的区别,datatype返回的数据类型有哪些?web开发中数据提交的几种方式,有什么区别。
  • 【C++】模板与泛型编程(一):定义模板,模板参数
  • oracle: create new database
  • JavaScriptEs6 - String类和Array类扩展内容
  • ThinkPHP接入PayPal支付
  • 一个比RTK或redux更轻量级更易使用的 React 第三方状态管理工具库的配置与使用
  • 云手机方案总结
  • 代码随想录day25 回溯4
  • C++ 23版的最新特性
  • WebService简介
  • 建筑工地AI安全检测系统:YOLO11数据标注训练与PyQt5界面设计应用开发
  • 契约锁数智化合同大会全国巡展启动,助力合同管理全程数字化转型
  • 【FAQ】HarmonyOS SDK 闭源开放能力 — Vision Kit(2)
  • 如何打造用户友好的维护页面:6个创意提升WordPress网站体验
  • 一键打断线(根据相交点打断)——CAD c# 二次开发
  • 查询Elasticsearch索引刷新间隔
  • [Unity Shader] 【游戏开发】【图形渲染】Shader数学基础3:矢量与标量的乘法与除法详解
  • IntelliJ IDEA 基本使用教程及Spring Boot项目搭建实战
  • 比亚迪“天神之眼”重磅升级,无图城市领航功能全国开通
  • I.MX6U 启动方式详解
  • mac 使用 launchctl 实现每次登录系统时 frpc 就会自动启动