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

python全栈学习记录(二十一)类的继承、派生、组合

类的继承、派生、组合

文章目录

  • 类的继承、派生、组合
  • 一、类的继承
  • 二、派生
  • 三、组合

一、类的继承

继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类。
继承的特性是:子类会遗传父类的属性(继承是类与类之间的关系)。

继承的好处就是可以减少代码的冗余。
在python中支持一个类同时继承多个父类。python3中如果一个类没有继承任何类,那默认继承object类,在python2中如果一个类没有继承任何类,不会继承object类。
新式类:但凡继承了object的类以及该类的子类都是新式类。
经典类:没有继承object的类以及该类的子类都是经典类。
在python3中都是新式类,只有在python2中才区别新式类与经典类。
新式类可以通过内置的__str__方法修改实例的打印值。

类继承类时只需要才()中写上需要继承的类即可,可以通过类的__bases__属性查看该类继承的类。

class A():passclass B(A):def __str__(self):return 'from B'print(B.__bases__)
b=B()
print(b)
<<< (<class '__main__.A'>,)
<<< from B

类的继承是为了减少代码的冗余:

class People:school='五道口职业技术学院'def __init__(self,name,age):self.name=nameself.age=ageclass Student(People):passclass Teacher(People):passs=Student('张三',18)
t=Teacher('李四',40)
print(s.school,t.school)
print(s.name,t.name)
<<<五道口职业技术学院 五道口职业技术学院
<<<张三 李四

上述代码中Student和Teacher中没有__init__方法和school属性,初始化时就会取父类People中找。People作为Student和Teacher的父类,存储了__init__方法和school属性就避免了Student和Teacher中重复存储代码的问题。

菱形继承:当一个子继承多个父类时,多个父类最终继承了同一个类,称之为菱形继承
菱形继承的问题:

  • 经典类下查找属性:深度优先查找
  • 新式类下查找属性:广度优先查找

总结一下,类中属性查找,方法继承的方式为:实例、实例对应的类、父类

如果继承关系是非菱形的,类的继承会按直接继承的顺序先找完一条路,再去找其他的路。如图所示的继承顺序为:先找最左侧的路B、E,再找中间的路C,最后找右侧的路D、F。也可以通过mro表直接查看类的继承顺序。
在这里插入图片描述

class F():passclass E():passclass B(E):passclass C():pass
class D(F):passclass A(B,C,D):passprint(A.__mro__)
<<< (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.F'>, <class 'object'>)

菱形继承的实现原理(新式类):图中的继承顺序为:首先按A的直接继承顺序找B这条路为B、E,到两条路相交的节点G后会跳转到下一条路C,再到下一条路D,找到D、F,当三条路全部找完以后再找节点G,之后再找F。

在这里插入图片描述

class H():passclass G(H):pass
class F(G):passclass E(G):passclass B(E):passclass C():pass
class D(F):passclass A(B,C,D):passprint(A.__mro__)
<<< (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.F'>, <class '__main__.G'>, <class '__main__.H'>, <class 'object'>)

由于一个类可以继承多个父类会导致复杂的菱形继承问题,所以python中设置了Mixins规范(阅读俗称的规范)

class Vehicle:passclass FlyableMixin:"""飞行功能"""print('flying')class CivilAircraft(FlyableMixin,Vehicle):passclass Helicopter(FlyableMixin,Vehicle):pass

如上代码中CivilAircraft、Helicopter表示两种类型的飞机,而飞机既属于交通工具又能飞行,为了避免复杂的多类继承问题,我们人为规定FlyableMixin表示一种功能混入CivilAircraft、Helicopter继承的类中用以提示代码阅读者FlyableMixin并不被视为父类,而Vehicle才是真正的父类。
Mixins规范注意点:

  • mixins类必须表示某种功能混入继承的类中,且一般以mixin、able、ible为后缀
  • mixins类表示的功能单一,如果需要混入多个功能必须写多个mixins类
  • 子类即便没有继承mixins类依然可以工作,只是子类会缺少某个功能
  • mixins类功能的实现不依赖继承它的子类

二、派生

派生:子类中新定义的属性,子类在使用时始终以自己的为准。

class People:school='五道口职业技术学院'def __init__(self,name,age):self.name=nameself.age=ageclass Student(People):def __init__(self,name,age,class_name):#People.__init__(self,name,age)super(Student,self).__init__(name,age)self.class_name=class_names=Student('张三',18,'一班')
print(s.name,s.age,s.class_name)
<<<张三 18 一班

上述代码中Student类派生了People的__init__方法,加入了class_name参数的初始化。由于name和age参数的初始化在People类中已经存在,为了避免代码的重复,可以重用父类的__init__方法。重用的方法有两种,一种是直接指名道姓使用People类的__init__方法,这种方式必须将self参数也传如__init__方法中;另一种是使用super函数继承People类的__init__方式,这种方式无需传入self参数,super会自动将函数中的self传给父类的__init__方法。在python3中super()中的参数可以不写,但是python2中super()中传的参数必须写上,并且必须是新式类才能使用super。
注意点:

  • super函数会以调用super函数的类为起始按类的继承顺序向后寻找继承的方法。可以通过mro表查看super的继承顺序。
    __mro__和__bases__的区别在于__bases__只能查看类直接的继承顺序,而__mro__可以查看类所以的继承顺序。
class F():pass
class A(F):def f1(self):print('from A')super().f1()class B():def f1(self):print('from B')class C(A,B):def f1(self):print('from C')super().f1()c=C()
print(C.__mro__)
print(C.__bases__)
<<< (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.F'>, <class '__main__.B'>, <class 'object'>)
<<< (<class '__main__.A'>, <class '__main__.B'>)
c.f1()
<<< from C
<<< from A
<<< from B

上述代码中c.f1()首先会运行C中的f1代码,然后运行super().f1(),此刻调用super的类是C,mro表中以C为起始向后寻找继承关系,找到A类的f1函数,再次运行super函数,再次在mro表中以A为起始向后找,找到B类,运行B的f1函数。

三、组合

组合就是一个类的对象具备某一个属性,该属性的值是指向另外外一个类的对象。
组合也是用来解决类与类直接代码冗余问题的。

class Course():def __init__(self,name,price):self.name=nameself.price=priceclass Teacher():def __init__(self,name):self.name=nameself.course=[]python=Course('python',1000)
c=Course('c',500)t1=Teacher('张1')
t2=Teacher('张2')
#将t1、t2的course属性和python、c组合到一起以便于使用course属性可以直接参考price属性的值
t1.course.extend([python,c])
t2.course.append(c)
print(t1.course[0].price)
print(t2.course[0].price)
<<<1000
<<<500

相关文章:

python全栈学习记录(二十一)类的继承、派生、组合

类的继承、派生、组合 文章目录 类的继承、派生、组合一、类的继承二、派生三、组合 一、类的继承 继承是一种新建类的方式&#xff0c;新建的类称为子类&#xff0c;被继承的类称为父类。 继承的特性是&#xff1a;子类会遗传父类的属性&#xff08;继承是类与类之间的关系&a…...

Go语言实现长连接并发框架 - 任务执行流

文章目录 前言接口结构体接口实现项目地址最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;上篇博客中我们实现了客户端的请求的实现&#xff0c;接下来我们要去实现对请求任务的处理&#xff0c;我们需要定义任务执行的流程 接口 trait/task.go type TaskFunc interfa…...

Flutter与原生代码通信

文章目录 1. 知识回顾2. 示例代码3. 经验总结我们在上一章回中介绍了通道相关的内容,本章回中将介绍其中的一种通道:MethodChannnel.闲话休提,让我们一起Talk Flutter吧。 1. 知识回顾 我们在上一章回中介绍了通道的概念和作用,并且提到了通道有不同的类型,本章回将其中一…...

每日读则推(三)

n.(事件的)发生地点,(活动的)场所 n.雄性大园丁鸟 n.多细枝的,苗条的 v.放大,扩大(声音);增强,加强 Male great bowerbirds build twiggy concert venues that amplify their raucous songs and n.园丁鸟 …...

Android Studio | 无法识别Icons.Default.Spa中的Spa

编写底部导航栏&#xff0c;涉及到Spa部分出现报红&#xff1a; 解决办法&#xff1a;在build.gradle.kts中引入图标依赖 dependencies {implementation "androidx.compose.material:material-icons-extended:<version>" }...

SKD4(note上)

微软提供了图形的界面API&#xff0c;叫GDI 如果你想画某个窗口&#xff0c;你必须拿到此窗口的HDC #include <windows.h> #include<tchar.h> #include <stdio.h> #include <strsafe.h> #include <string>/*鼠标消息 * 键盘消息 * Onkeydown * …...

rabbitmq----数据管理模块

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 交换机数据管理管理的字段持久化管理类内存管理类申明交换机删除交换机获取指定交换机 队列数据管理管理的字段持久化管理类内存管理类申明/删除/获取指定队列获取所…...

【人工智能深度学习应用】妙笔API最佳实践

AI妙笔是一款以文本创作为主、多模态为辅的生成式创作大模型产品&#xff0c;专门为传媒、政务等特定的行业和组织提供行业化的内容创作辅助。它具备深度的行业知识&#xff0c;能够生成高质量的专业内容&#xff0c;能覆盖各行业常见的文体类型&#xff0c;写作文体丰富多样&a…...

SOMEIP_ETS_150: SD_Send_triggerEventUINT8Multicast_Eventgroup_6

测试目的&#xff1a; 验证DUT在Tester订阅事件组后&#xff0c;能够响应Tester触发的triggerEventUINT8Multicast方法&#xff0c;并将TestEventUINT8Multicast事件发送到订阅请求中端点选项指定的IP地址和端口。 描述 本测试用例旨在确保DUT能够正确处理事件组的订阅请求&…...

【EXCEL数据处理】000009 案列 EXCEL单元格数字格式。文本型数字格式和常规型数字格式的区别

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000009 案列 EXCEL单元格数字格式。文本型数字格式和…...

Vxe UI vue vxe-table vxe-text-ellipsis 如何实现单元格多行文本超出、多行文本溢出省略

Vxe UI vue vxe-table 如何实现单元格多行文本超出、多行文本溢出省略 代码 配合 vxe-text-ellipsis 组件实现多行文本溢出省略 <template><div><vxe-grid v-bind"gridOptions"><template #defaultAddress"{ row }"><vxe-te…...

FFmpeg源码:avio_feof函数分析

AVIOContext结构体和其相关的函数分析&#xff1a; FFmpeg源码&#xff1a;avio_r8、avio_rl16、avio_rl24、avio_rl32、avio_rl64函数分析 FFmpeg源码&#xff1a;read_packet_wrapper、fill_buffer函数分析 FFmpeg源码&#xff1a;avio_read函数分析 FFmpeg源码&#xff…...

各省-城镇化率(2001-2022年)

数据收集各省-城镇化率&#xff08;2001-2022年&#xff09;.zip资源-CSDN文库https://download.csdn.net/download/2401_84585615/89465885 相关指标&#xff1a; 包括省份、年份、年末总人口数(万人)、年末城镇人口数(万人)、城镇化率等。 数据集构建&#xff1a; 数据集通…...

飞创龙门双驱XYZ直线模组高精度应用实例

飞创龙门双驱XYZ直线模组集超精密定位、高动态响应和灵活配置于一体&#xff0c;适用于电子制造行业&#xff08;点胶、组装、检测&#xff09;、半导体圆晶加工、芯片封装、激光切割、激光焊接、数控机床、精密检测及科研实验等&#xff0c;满足高精度、高动态的三维定位需求&…...

Prompt 初级版:构建高效对话的基础指南

Prompt 初级版&#xff1a;构建高效对话的基础指南 文章目录 Prompt 初级版&#xff1a;构建高效对话的基础指南一 “标准”提示二 角色提示三 多范例提示四 组合提示五 规范化提示 本文介绍了提示词的基础概念与不同类型&#xff0c;帮助用户更好地理解如何在对话中构建有效的…...

餐饮重点企业在AI领域的布局,看方大的AI实践

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 AI已经被应用在餐饮餐厨行业的哪些方面&am…...

Axure PR 9 开关切换 设计交互

大家好&#xff0c;我是大明同学。 这期内容&#xff0c;我们来探讨Axure开关按钮设计与交互技巧​。 创建切换开关所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.将“圆形”元件拖到画布上&#xff0c;在样式窗格中将高度和宽度设置为35&#xff0c;线段宽度…...

ruoyi-python 若依python版本部署及新增模块

ruoyi spring版本支持一键导出前后端代码&#xff0c;且b站上有很多教程&#xff0c;但是发现python版本的教程并不多&#xff0c;于是自己尝试创建一个简易的CRUD模块 1.各版本bug 主要尝试了1.1.2版本和vue2的版本&#xff0c;链接如下&#xff1a; v1.1.2 vue2 两个版本…...

【理论】负载均衡

目录 1. 定义2. 主要作用3. 实现方法4. 实现原理 1. 定义 负载均衡&#xff08;Load Balancing&#xff09;将网络流量、请求等输入分发到后端服务器&#xff0c;为后端服务器提供负载均衡&#xff0c;实现高可用和容错。 2. 主要作用 1. 高并发 通过将请求均匀分配到多个服务…...

流行前端框架Vue.js详细学习要点

Vue.js是一款流行的JavaScript前端框架&#xff0c;用于构建用户界面&#xff0c;特别是在构建交互式Web应用程序时表现出色。以下是Vue.js详细学习的一些要点&#xff1a; 1. Vue.js基础 定义与特点&#xff1a;Vue.js是一款渐进式JavaScript框架&#xff0c;提供响应式数据…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...