当前位置: 首页 > 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;提供响应式数据…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...