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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/55330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序猿成长之路之设计模式篇——设计模式简介

无论是对于代码质量还是代码可维护性、可扩展性&#xff0c;使用合适的设计模式都能够起到促进提升的作用&#xff0c;此外在软考的软件工程师、系统架构师职称考试中&#xff0c;设计模式也是必考的一块内容&#xff0c;因此我打算开拓一个新的专栏简单介绍一下设计模式&#…

腾讯一面-LRU缓存

为了设计一个满足LRU&#xff08;最近最少使用&#xff09;缓存约束的数据结构&#xff0c;我们可以使用哈希表&#xff08;HashMap&#xff09;来存储键值对&#xff0c;以便在O(1)时间复杂度内访问任意键。同时&#xff0c;我们还需要一个双向链表&#xff08;Doubly Linked …

智慧水务可视化:高效管理水资源

利用图扑先进的可视化技术&#xff0c;实现对水资源的实时监控与高效管理&#xff0c;提高水务工作的透明度和决策效率&#xff0c;促进水资源的可持续利用。

太原网站制作打造企业网站的关键要素

太原网站制作&#xff1a;打造企业网站的关键要素 在数字化时代&#xff0c;企业网站成为了品牌形象和市场营销的重要一环。太原的企业在进行网站制作时&#xff0c;需要关注几个关键要素&#xff0c;以确保网站能够有效提升企业竞争力和用户体验。 **1. 目标明确** 在网站制…

利用Spring Boot打造新闻推荐解决方案

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

Elasticsearch 8.16 和 JDK 23 中的语言环境变化

作者&#xff1a;来自 Elastic Simon Cooper 随着 JDK 23 即将发布&#xff0c;语言环境信息中有一些重大变化&#xff0c;这将影响 Elasticsearch 以及你提取和格式化日期时间数据的方式。首先&#xff0c;介绍一些背景知识。 什么是语言环境&#xff1f; 每次 Java 程序需要…

资源《Arduino 扩展板4-单游戏摇杆》说明。

资源链接&#xff1a; Arduino 扩展板4-单游戏摇杆 1.文件明细&#xff1a; 2.文件内容说明 包含&#xff1a;AD工程、原理图、PCB。 3.内容展示 4.简述 该文件为PCB工程&#xff0c;采用AD做的。 该文件打板后配合Arduino使用&#xff0c;属于Arduino的扩展板。 该文件…

JVM和GC监控技术

一、监控技术简介 JVM是什么&#xff1f;项目里面有JVM吗&#xff1f;JVM跟Tomcat有什么关系&#xff1f;为什么需要去分析JVM&#xff1f; 1. JVM(全称&#xff1a;Java Virtual Machine)&#xff0c;Java虚拟机 是Java程序运行的环境&#xff0c;它是一个虚构的计算机&…

Netty 与 WebSocket之间的关系

WebSocketProtocolHandler 和 Netty 在处理 WebSocket 连接时扮演不同的角色&#xff0c;但它们通常是一起使用的&#xff0c;尤其是在基于 Netty 的项目中。为了更好地理解它们之间的区别&#xff0c;我们首先需要了解 WebSocket 和 Netty 的基本概念。 WebSocket WebSocket…

RK3568平台(显示篇)车机图像显示偏白问题分析

一.显示偏白图片对比 正常图像: 偏白图像: 二.分析过程

51单片机系列-按键检测原理

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 独立按键是检测低电平的。 下面我们来看一张对应的电路原理图&#xff1a; 在这张图当中&#xff0c;P1&#xff0c;P2&#xff0c;P3内部都上拉了电阻&#xff0c;但是P0没有&am…

day03 笔试练习

1.简写单词 题目链接&#xff1a;简写单词_牛客题霸_牛客网 public static void main(String[] args) {Scanner sc new Scanner(System.in);while(sc.hasNext()){ // 输入多少读入多少char ch sc.next().charAt(0); // 提取首字母if(ch > a && ch < z){System…

项目定位与服务器(SERVER)模块划分

目录 定位 HTTP协议以及HTTP服务器 高并发服务器 单Reactor单线程 单Reactor多线程 多Reactor多线程 模块划分 SERVER模块划分 Buffer 模块 Socket模块 Channel 模块 Connection模块 Acceptor模块 TimerQueue模块 Poller模块 EventLoop模块 TcpServer模块 SE…

ElementUI el-tree 树组件 增加辅助线

需求 项目需求给elementUI的el-tree添加辅助线&#xff0c;并且不能使用其他插件&#xff0c;没办法只能该样式了。 效果 代码 html <template><div><el-scrollbar class"long-content"><el-tree node-key"id":data"deptTre…

Android 简单实现联系人列表+字母索引联动效果

效果如上图。 Main Ideas 左右两个列表左列表展示人员数据&#xff0c;含有姓氏首字母的 header item右列表是一个全由姓氏首字母组成的索引列表&#xff0c;点击某个item&#xff0c;展示一个气泡组件(它会自动延时关闭)&#xff0c; 左列表滚动并显示与点击的索引列表item …

k8s搭建一主三从的mysql8集群---无坑

一&#xff0c;环境准备 1.1 k8s集群服务器 ip角色系统主机名cpumem192.168.40.129mastercentos7.9k8smaster48192.168.40.130node1centos7.9k8snode148192.168.40.131node2centos7.9k8snode248192.168.40.132node3centos7.9k8snode348 k8s集群操作请参考《K8s安装部署&…

算法种类丰富,分析准确率业内领先的智慧能源开源了

一、简介 AI视频监控平台, 是一款功能强大且简单易用的实时算法视频监控系统。愿景在最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;减少企业级应用约 95%的开发成本&#xff0c;在强大视频算…

Java | Leetcode Java题解之第450题删除二叉搜索树中的节点

题目&#xff1a; 题解&#xff1a; class Solution {public TreeNode deleteNode(TreeNode root, int key) {TreeNode cur root, curParent null;while (cur ! null && cur.val ! key) {curParent cur;if (cur.val > key) {cur cur.left;} else {cur cur.rig…

docker快速安装ELK

一、创建elk目录 创建/elk/elasticsearch/data/目录 mkdir -p /usr/local/share/elk/elasticsearch/data/ 创建/elk/logstash/pipeline/目录 mkdir -p /usr/local/share/elk/logstash/pipeline/ 创建/elk/kibana/conf/目录 mkdir -p /usr/local/share/elk/kibana/conf/ 二、创建…

基于ESP8266—AT指令连接阿里云+MQTT透传数据(1)

在阿里云创建MQTT产品的过程涉及几个关键步骤,主要包括注册阿里云账号、实名认证、开通MQTT服务实例、创建产品与设备等。以下是详细的步骤说明: 一、准备工作 访问阿里云官网,点击注册按钮,填写相关信息(如账号、密码、手机号等)完成注册。注册完成后,需要对账号进行实…