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

Python学习笔记12:进阶篇(二),类的继承与组合

类的继承

我们在编写一系列的类的时候,会发现这些类很相似,但是又有各自的特点和行为。在编写这些类的时候,我们可以把相同的部分抽象成一个基类,然后根据其他不同的特点和行为,抽象出子类,继承这个基类。通过继承,我们就可以方便的完整这一些列类的抽象。

示例

class Person:def __init__(self, name, age):self.name = nameself.age = ageself.country = "中国"  # 设置默认值def speak(self):print(f"大家好, 我的名字是{self.name}, 今年{self.age}岁,我来自{self.country}. 我讲的是普通话.")class GuangdongPerson(Person):def __init__(self, name, age):super().__init__(name, age)self.province = "广东"def speak(self):print(f"大家好, 我是{self.name}, 今年{self.age}岁,我来自{self.country}{self.province}. 我会讲广东话.")class TaiwanPerson(Person):def __init__(self, name, age):super().__init__(name, age)self.province = "台湾"def speak(self):print(f"大家好, 我是{self.name}, 今年{self.age}岁,我来自{self.country}{self.province}. 我会讲台湾话.")zhang_san = GuangdongPerson("张三", 18)
li_si = TaiwanPerson("李四", 20)
zhang_san.speak()
li_si.speak()

在这里插入图片描述

例子不能说讲的很好哈,能理解就行。像我之前推荐的书,书里的举例是car,其他教程里面可能还有shape。但是举什么例子不重要,重要的是了解什么是继承,继承能干什么,有什么意义,好处和坏处是什么。

什么是继承

继承是一种面向对象编程的基本特性,它允许我们定义一个类(称为子类或派生类),该类可以从另一个已经存在的类(称为父类或基类)那里继承属性和方法。这意味着子类会自动获得父类的所有功能,同时还可以定义或修改自己的属性和方法,或者覆盖父类的方法来实现特定的功能。
在示例中,我们先定义了一个父类Person。而后定义了GuangdongPerson和TaiwanPerson两个类,这两个类定义了自己的属性,继承Person类的三个属性和函数,最后我们重写来自于父类的方法。

为什么要继承

继承的主要目的是促进代码的复用性、模块化和易于维护。通过继承,我们可以创建一个通用的基类来封装共同的行为,然后为具有特殊需求的子类添加或修改功能,而不需要重复编写相同的代码。

继承有哪些缺点

没有完美无缺的事物,继承在提供便利的同时也带来一些问题:

  1. 过度耦合: 如果子类过于依赖父类的实现细节,当父类发生变化时,可能会对子类产生意想不到的影响。这种紧密的耦合关系使得代码难以修改和维护。
  2. 复杂度增加: 随着继承层次的加深,类结构会变得更加复杂。开发者需要跟踪多个层级的继承关系,理解每个类的功能和责任变得困难。
  3. 灵活性降低: 继承是静态的,一旦一个类继承了另一个类,这种关系就固定下来,不能在运行时改变。这限制了代码的灵活性和可重用性。
  4. 菱形问题(Diamond Problem): 在多继承的语言中,如果多个父类拥有同一个方法或属性,子类可能会遇到冲突,不确定应该使用哪一个父类的实现。
  5. 代码可读性和可维护性下降: 过度使用继承可能导致“类爆炸”,即类的数量急剧增加,这会使代码库变得庞大且难以管理。

什么时候用继承

选择使用继承主要取决于以下几个场景和原则:

  1. 共享行为和属性: 当多个类具有相似的属性和行为时,可以考虑使用继承。一个基类可以定义这些共性部分,而子类则专注于差异化的部分。例如,各种动物类可能都共享“移动”和“吃”的行为,但具体实现各不相同。
  2. 代码复用: 继承允许子类重用父类的代码,减少重复代码,提高代码的可维护性。如果多个类需要执行相同的操作或拥有相同的属性,通过继承可以避免重复定义这些内容。
  3. 层次结构: 当类之间存在明显的层次或分类关系时,继承是自然的选择。例如,在一个图形界面库中,Widget类可以作为基类,而Button、TextBox等具体控件类继承自它,形成一个清晰的层次结构。
  4. 接口一致性: 如果希望一组类提供一致的接口给外部使用者,即使它们的内部实现不同,也可以通过继承来实现。这使得客户端代码可以以统一的方式处理这些类的实例。
  5. 抽象类和接口: 使用抽象基类(ABC)可以定义一个接口或模板,强制子类必须实现特定的方法,从而保证了设计的一致性和约束性。

通常继承和组合两个方式来实现某些属性和行为的复用。当两个类之间的关系不是“is-a”的关系,而是“has-a”的关系时,组合(包含另一个类的实例)通常是更好的选择。

组合

当我们需要复用某些类的属性和行为的时候,使用继承的方式和客观事实相违背,但是有另一个符合客观事实的复用方式,就是组合。简单理解为定义一个类A的时候,将另一个已存在的类BA自己本身的一些属性和行为放到一起组合成类A

什么是组合

组合(Composition)是面向对象编程中的另一种重要的设计原则,用于表示“整体-部分”(has-a)的关系,而不是继承所表达的“是一个”(is-a)的关系。在组合中,一个类的对象可以包含另一个或多个类的对象作为其属性,以此来实现更复杂的功能或结构,而无需通过继承来扩展类的功能。

组合的好处

  1. 灵活性:相比于继承,组合提供了更高的灵活性。因为对象可以在运行时动态地添加、替换或移除其组成部分,这使得系统更加灵活,更容易适应变化。
  2. 明确的责任分配:每个对象负责自身的功能,整体对象通过协调其组成部分来完成更复杂的任务,这有助于遵循单一职责原则。
  3. 避免继承的局限性:组合可以有效避免继承的缺点,如多重继承的菱形问题、过深的继承层次导致的复杂性等。
  4. 促进代码重用:通过将复杂对象构建为简单对象的组合,可以在不同的上下文中重用这些简单对象,而不需要创建新的继承层次。

什么时候用组合

  1. 当一个类需要使用另一个类的功能,但两者之间不存在“是一种”关系时。
  2. 当需要在运行时动态地调整或扩展对象的功能时。
  3. 当想要设计出高度可配置和可变的对象结构时。

示例

class Engine:def start(self):print("Engine started.")class ElectricEngine(Engine):def start(self):print("Electric Engine started.")class InternalCombustionEngine(Engine):def start(self):print("Internal Combustion Engine started.")class Car:def __init__(self):self.engine = Engine()  # Car类包含了一个Engine对象,这就是组合def set_engine(self, engine):self.engine = enginedef start_car(self):self.engine.start()  # 通过组合的Engine对象来启动汽车my_car = Car()
# 普通引擎
my_car.start_car()
my_car.set_engine(ElectricEngine())
# 电动引擎
my_car.start_car()
my_car.set_engine(InternalCombustionEngine())
# 汽油引擎
my_car.start_car()

在这里插入图片描述
在例子中,我们需要定义一个汽车类。汽车可以通过引擎启动。所以我们先定义一个引擎类来启动汽车。这个时候问题来了,汽车继承引擎,是不是很奇怪。汽车和引擎很明显不是is-a的关系,而是has-a的关系,所以我们需要使用组合的方式,将引擎类作为汽车的一个属性封装到汽车类中。
最后,使用不同的引擎,启动方法的实现也不一样,成功完成目标需求。

作业:

  1. 了解is-a和has-a,举出例子,分别使用继承和组合的方式实现类的复用。

下课!!!

点赞收藏关注,感谢支持!!!

相关文章:

Python学习笔记12:进阶篇(二),类的继承与组合

类的继承 我们在编写一系列的类的时候,会发现这些类很相似,但是又有各自的特点和行为。在编写这些类的时候,我们可以把相同的部分抽象成一个基类,然后根据其他不同的特点和行为,抽象出子类,继承这个基类。…...

npm install cnpm -g 报错4048

npm install cnpm -g 报错4048 设置淘宝镜像: 报错如下: 其他博主提供的方法都尝试了,比如管理员权限打开终端,删除.npmrc文件,清除缓存npm cache clean -f等都试了无效,最后怀疑是npm和cnpm版本不对应&…...

本地快速部署 SuperSonic

本地快速部署 SuperSonic 0. 引言1. 本地快速部署 supersonic2. 访问 supersonic3. 支持的数据库4. github 地址 0. 引言 SuperSonic融合Chat BI(powered by LLM)和Headless BI(powered by 语义层)打造新一代的BI平台。这种融合确…...

如何给vue开发的网站做seo?

最近公司有个需求,需要给公司的官网sqlynx做seo,但因为各种历史原因吧,原来的网站是用vue开发的。没办法,只能尝试尽量做一些seo,让网站能更好一些。 目录 1. 服务器端渲染(SSR) 2. 预渲染&am…...

算法训练营第六十天(延长12天添加图论) | LeetCode 647 回文子串、LeetCode 516 最长回文子序列

LeetCode 67 回文子串 思路很简单&#xff0c;每一个dp[i]等于dp[i-1]加上当前字符向前直到0各个长度字符串回文串个数即可 代码如下&#xff1a; class Solution {public boolean isValid(String s) {int l 0, r s.length() - 1;while (l < r) {if (s.charAt(l) ! s.ch…...

TikTok账号养号的流程分享

对于很多刚开始运营TikTok的新手小白来说&#xff0c;都会有一个同样的疑问&#xff0c;那就是&#xff1a;TikTok到底需不需要养号&#xff1f;这里明确告诉大家是需要养号的&#xff0c;今天就把我自己实操过的养号经验和策略总结出来&#xff0c;分享给大家。 一、什么是Ti…...

C++初学者指南第一步---6.枚举和枚举类

C初学者指南第一步—6.枚举和枚举类 文章目录 C初学者指南第一步---6.枚举和枚举类1.作用域的枚举(enum class类型&#xff09;&#xff08;C11&#xff09;2.无作用域的枚举(enum类型)3.枚举类的基础类型4.自定义枚举类映射5.和基础类型的互相转换 1.作用域的枚举(enum class类…...

【js判断机型】

var isIOS /(iPhone|iPad|iPod)/i.test(navigator.userAgent) var isiPad navigator.userAgent.match(/(iPad)/) || (navigator.platform ‘MacIntel’ && navigator.maxTouchPoints > 1) 上面这个不行的话&#xff0c;再试下这个 var isiPad (navigator.userAg…...

google chrome浏览器安装crx插件Jam

先上一张图&#xff1a; Jam是bug报告生成插件 1、在地址栏中输入chrome://extensions/&#xff0c;然后回车。 2、将下载好的crx插件&#xff0c;直接拖到里面就可以完成安装工作了。 3、测试了一下jam插件&#xff0c;发现直接没有响应。 4、点击【移除】直接可以删除插件…...

【Java面试】二十、JVM篇(上):JVM结构

文章目录 1、JVM2、程序计数器3、堆4、栈4.1 垃圾回收是否涉及栈内存4.2 栈内存分配越大越好吗4.3 方法内的局部变量是否线程安全吗4.4 栈内存溢出的情况4.5 堆和栈的区别是什么 5、方法区5.1 常量池5.2 运行时常量池 6、直接内存 1、JVM Java源码编译成class字节码后&#xf…...

【Python教程】压缩PDF文件大小

压缩 PDF 文件能有效减小文件大小并提高文件传输的效率&#xff0c;同时还能节省计算机存储空间。除了使用一些专业工具对PDF文件进行压缩&#xff0c;我们还可以通过 Python 来执行该操作&#xff0c;实现自动化、批量处理PDF文件。 本文将分享一个简单有效的使用 Python 压缩…...

UE4中性能优化和检测工具

UE4中性能优化和检测工具合集 简述CPUUnreal InsightUnreal ProfilerSimpleperfAndroid StudioPerfettoXCode TimeprofilerBest Practice GPUAdreno GPUMali GPUAndroid GPU Inspector (AGI) 内存堆内存分析Android StudioLoliProfilerUE5 Memory InsightsUnity Mono 内存Memre…...

大型ERP设计-业务与功能指引:外币折算与辅助账套

外币折算与辅助账套 前言&#xff1a;在对ORACLE和SAP的核心模块功能全面解读的基础上&#xff0c;给出大型ERP设计的建议-业务与功能指引&#xff0c;企业选型、开发大型ERP软件的公司和ERP顾问可以参考。模块包括财务、计划与制造、供应链、项目及设备(MRO)&#xff0c;初步预…...

重学java 73.设计模式

本想送你一本沉思录&#xff0c;可该迷途知返的人是我 —— 24.6.18 设计模式 设计模式(Design pattern)&#xff0c;是一套被反复使用、经过分类编目的、代码设计经验的总结&#xff0c;使用设计模式是为了可重用代码、保证代码可靠性、程序的重用性,稳定性。 1995 年&#x…...

线代的学习(矩阵)

1.矩阵的乘法 矩阵实现满足&#xff1a;内标相等 矩阵相乘之后的结果&#xff1a;前行后列 需要注意&#xff1a;1.矩阵的乘法不具有交换律&#xff1a;AB!BA 2.矩阵的乘法满足分配律&#xff1a;A(BC) AB AC 抽象逆矩阵求逆矩阵 方法1.凑定义法、 方法2.长除法 数字型矩阵…...

【Java基础5】JDK、JRE和JVM的区别与联系

JDK、JRE和JVM的区别与联系 Java是一种广泛使用的编程语言&#xff0c;它的跨平台特性得益于Java虚拟机&#xff08;JVM&#xff09;。然而&#xff0c;在Java的世界里&#xff0c;JDK、JRE和JVM这三个术语常常让人感到困惑。本文将阐述它们各自的功能&#xff0c;以及它们是如…...

2024年先进机械电子、电气工程与自动化国际学术会议(ICAMEEA 2024)

2024年先进机械电子、电气工程与自动化国际学术会议(ICAMEEA 2024) 2024 International Conference on Advanced Mechatronic, Electrical Engineering and Automation 会议地点&#xff1a;杭州&#xff0c;中国 网址&#xff1a;www.icameea.com 邮箱: icameeasub-conf.c…...

WPF 深入理解四、样式

样式 WPF中的各类控件元素,都可以自由的设置其样式。 诸如: 字体(FontFamily) 字体大小(FontSize) 背景颜色(Background) 字体颜色(Foreground) 边距(Margin) 水平位置(HorizontalAlignment) 垂直位置(VerticalAlignment)等等。 而样式则是组织和重用以上的重要工具。不是使…...

TCP相关细节

1. 常用TCP参数 1.1 ReceiveBufferSize ReceiveBuffersize指定了操作系统读缓冲区的大小&#xff0c; 默认值是8192(如图5-10 所示)。在第4章的例子中,会有"假设操作系统缓冲区的长度是8" 这样的描述,可通过socket.ReceiveBufferSize 8 实现。当接收端缓冲区满了的时…...

flutter实现UDP发送魔法包唤醒主机

魔法包 魔法包是用16进制表示的数据包&#xff0c;它是由固定的前缀数据(FFFFFFFFFFFF)以及固定重复次数(16次)的目标主机MAC地址组成。 假设目标主机的MAC地址是&#xff1a;"50:eb:f6:27:ae:a8" 那么魔法包就是[FFFFFFFFFFFF50EBF627AEA850EBF627AEA850EBF627AEA8…...

回溯算法练习题(2024/6/18)

1全排列 II 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,…...

DSP——从入门到放弃系列2——PLL锁相环(持续更新)

1、概述 锁相环&#xff08;Phase Locked Loop,PLL&#xff09;是处理器的时钟源&#xff0c;控制着C6678处理器中C66x内核、各外围设备的时钟的时钟比、对准和选通功能。 2、功能描述 上图显示了PLL和PLL控制器的逻辑实现。PLL控制器提供通过软件可配置的分频器&#xff0…...

Altair 人工智能技术助力MABE预测消费者行为,实现设备性能优化

主要看点 行业&#xff1a; 家电行业 挑战&#xff1a; 企业面临的挑战是如何利用已收集的大量数据&#xff0c;深入了解消费者在产品使用过程中对某些保鲜程序的影响。 Altair 解决方案&#xff1a; Altair采用了Altair RapidMiner人工智能平台来解决问题&#xff0c;特别是…...

解决Spring Boot项目中数据源URL属性的问题

今天测试Springboot项目的时候&#xff0c;报错&#xff1a; . ____ _ __ _ _/\\ / ____ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | _ | _| | _ \/ _ | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) ) |____| .__|_| |_|_| |_\__, | / / / /|_||___…...

Java每日作业day6.18

ok了家人们今天我们继续学习方法的更多使用&#xff0c;闲话少叙&#xff0c;我们来看今天学了什么 1.重载 在同一个类中&#xff0c;可不可以存在同名的方法&#xff1f;重载:在同一个类中&#xff0c;定义了多个同名的方法&#xff0c;但每个方法具有不同的参数类型或参数个…...

mac如何检测硬盘损坏 常用mac硬盘检测坏道工具推荐

mac有时候也出现一些问题&#xff0c;比如硬盘损坏。硬盘损坏会导致数据丢失、系统崩溃、性能下降等严重的后果&#xff0c;所以及时检测和修复硬盘损坏是非常必要的。那么&#xff0c;mac如何检测硬盘损坏呢&#xff1f;有哪些常用的mac硬盘检测坏道工具呢&#xff1f; 一、m…...

怎么通俗理解概率论中的c r(cramer rao 克拉默拉奥)不等式?

还是推一下比较好记 视频链接 【数理统计学重要定理证明&#xff1a;C-R不等式——无偏估计的方差下界-哔哩哔哩】 https://b23.tv/4gk1AvU 【数理统计学重要定理证明&#xff1a;C-R不等式——无偏估计的方差下界-哔哩哔哩】...

Flask之模板

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、模板的基本用法 1.1、创建模板 1.2、模板语法 1.3、渲染模板 二、模板辅助工具 2.1、上下文 2.2、全局对象 2.3、过滤器 2.4、测试…...

如何优化 Bash 脚本的执行效率?

要优化 Bash 脚本的执行效率&#xff0c;可以考虑以下几个方面&#xff1a; 减少命令执行次数&#xff1a;Bash 脚本中的命令执行是比较耗时的&#xff0c;在可能的情况下&#xff0c;可以尽量减少命令的执行次数。例如&#xff0c;可以将多个命令合并成一个&#xff0c;使用管…...

c语言---循环 、判断基础知识详解

if语句 else离最近的if语句结合。 if语句题目 //1. 判断一个数是否为奇数 //2. 输出1 - 100之间的奇数 #include <stdio.h> int main() {int n 0;scanf("%d", &n);if (n % 2){printf("奇数\n");}else{printf("不是奇数\n"…...

北京市保障房建设投资中心网站首页/免费的网站域名查询app

转自&#xff1a;http://www.tairan.com/archives/3998 cocos2d-x 中有自己的定时器实现&#xff0c;一般用法是在场景&#xff0c;层等内部实现&#xff0c;定时器的生命周期随着它们的消亡而消亡&#xff0c;就运行周期而言&#xff0c;相对最长的是场景&#xff0c;如果在多…...

北京++网站建设咨询顾问公司/百度健康

前言最近改用ER\Studio建模&#xff0c;发现ER\Studio居然不支持生成mysql列注释&#xff0c;看网上都说勾选即可&#xff0c;然后生成mysql时并没有那个勾选项&#xff0c;试了下生成Oracle和DB2是支持的…没有注释&#xff0c;那实体Bean的注释要手码&#xff1f;…no no no于…...

企业制作宣传片/windows优化大师怎么下载

前言近两天的工作是将以前项目的Sybase Anywhere 11数据库表结构以及数据导出到Sqlite上&#xff0c;起初想法是通过PowerDesigner来做反向工程然后再导出。装工具找资料折腾老半天&#xff0c;一方面不是很会用&#xff0c;勉强能将表反向工程到PowerDesigner&#xff0c;导出…...

毕业设计做健身房网站的意义/关键词优化seo

1.try,catch,finally try关键字用来包围可能会出现异常的逻辑代码&#xff0c;它单独无法使用&#xff0c;必须配合catch或者finally使用。Java编译器允许的组合使用形式只有以下三种形式&#xff1a; try...catch...; try....finally......; try....catch...finally.…...

做时时彩测评网站/广州网站关键词推广

算法思想&#xff1a;分治法 实际问题&#xff1a;快速排序 编写语言&#xff1a;JavaJava代码//本篇博文代码主要有两种基准选择方式&#xff1a;基准低下标处的值&#xff0c;基准随机值import java.util.Random;public class QuickSort{public static void main(String[] ar…...

管理网站制作/廊坊百度关键词优化怎么做

文章目录各个数据结构的优缺点数组结构链表结构树形结构二叉树简介二叉树遍历前序遍历中序遍历后序遍历二叉树查找二叉树节点的删除各个数据结构的优缺点 数组结构 查找快&#xff0c;删除插入慢。 链表结构 删除插入块&#xff0c;查找慢。 树形结构 综合了链表和数组的…...