Python 从入门到实战24(类的继承)

news2024/11/16 4:15:28

        我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。

上篇文章我们讨论了类的定义、使用方法、@property的相关知识。今天我们将学习一下类的继承。

1、继承的基本语法

继承是面向对象编程最重要的特性之一,被继承的类称为父类或者基类。在它的基础上新建的类称为子类或者派生类。

继承的语法格式:

class  ClassName(baseclasslist):

         ‘’’类的帮助信息’’’

         statement      #类体

参数说明:ClassName -----指定类名

          statement -----类体,主要由类变量、方法和属性等定义语句组成

          baseclasslist----要继承的基类,可以有多个,类名之间由,分割

1)举例1:

#水果类为基类,然后创建其派生类的练习
class Fruit:   #定义水果类
    color = "green"  #定义类的属性
    def harvest(self,color):  #定义方法
        print("水果颜色是:"+color+"的!")
        print("水果收获了!")
        print("水果开始是:"+Fruit.color+"的!") #输出类的属性
class Banana(Fruit):  #定义派生类香蕉
    color = "yellow"
    def __init__(self):
        print("我是香蕉")
class Pear(Fruit):     #定义派生类梨
    color = "cyan"
    def __init__(self):
        print("我是梨")
banana = Banana()   #创建类的实例
banana.harvest(Banana.color)#调用基类的方法
pear = Pear()   #创建类的实例
pear.harvest(Pear.color)#调用基类的方法

输出结果参考:

2)举例2

#举例汽车类

class Vehicle:

    def __init__(self, make, model, year):

        self.make = make

        self.model = model

        self.year = year

    def start(self):

        print(f"{self.make} {self.model} started.")

    def stop(self):

        print(f"{self.make} {self.model} stopped.")

class Car(Vehicle):

    def start(self):

        print(f"{self.make} {self.model} revved the engine and started.")

car = Car()

car.start()

这样写执行会报错,car = Car()  因为car 继承Vehicle类,继承init方法

需要加上参数:car = Car("BYD","pro","2025")

改写后正常输出:

2、方法重写

基类的成员都会被派生类继承,当基类中的某个方法不完全适用派生类时,可以在派生类重写类的方法。还是上面的例子,我们重写harvest 方法

举例说明:

#水果类为基类,然后创建其派生类的练习
class Fruit:   #定义水果类
    color = "green"  #定义类的属性
    def harvest(self,color):  #定义方法
        print("水果颜色是:"+color+"的!")
        print("水果收获了!")
        print("水果开始是:"+Fruit.color+"的!") #输出类的属性
class Banana(Fruit):  #定义派生类香蕉
    color = "yellow"
    def __init__(self):
        print("我是香蕉")
class Pear(Fruit):     #定义派生类梨
    color = "cyan"
    def __init__(self):
        print("我是梨")
    def harvest(self,color):
        print("
梨的颜色是:" + color + "的!")
        print("
梨收获了!")
        print("
梨开始是:" + Fruit.color + "的!")  # 输出类的属性
banana = Banana()   #创建类的实例
banana.harvest(Banana.color)#调用基类的方法
pear = Pear()   #创建类的实例
pear.harvest(Pear.color)#调用基类的方法

上面代码黄色阴影的部分是重写方法,输出结果参考:

3、派生类中调用基类的__init__()方法

在派生类中定义__init__()方法时,不会自动调用基类的__init__()。

如下面例子:

#水果类为基类,然后创建其派生类的练习
class Fruit:   #定义水果类
    def __init__(self,color="green"):
        Fruit.color = color
    def harvest(self):  #定义方法
        print("水果开始是:"+Fruit.color+"的!") #输出类的属性
class Banana(Fruit):  #定义派生类香蕉
    color = "yellow"
    def __init__(self):
        print("我是香蕉")
banana = Banana()
banana.harvest()

上面这么写会报错,不能直接调用基类的__init__()

若是想要在派生类中调用基类__init__()方法,需要在派生类中使用super()函数,下面添加黄色背景部分的代码,注意缩进,是在派生类的__init__()方法中调用基类的__init__()方法。

#水果类为基类,然后创建其派生类的练习
class Fruit:   #定义水果类
    def __init__(self,color="green"):
        Fruit.color = color
    def harvest(self):  #定义方法
        print("水果开始是:"+Fruit.color+"的!") #输出类的属性
class Banana(Fruit):  #定义派生类香蕉
    def __init__(self):
        print("我是香蕉")
        super().__init__()
banana = Banana()
banana.harvest()

参考输出:

再举例说明具体的应用:

#水果类为基类,然后创建其派生类的练习
class Fruit:   #定义水果类
    def __init__(self,color="green"):
        Fruit.color = color
    def harvest(self,color):  #定义方法
        print("水果的颜色是:"+self.color+"的!") #输出类的属性
        print("水果开始收获了")
        print("水果开始的颜色是:" + Fruit.color + "的!")  # 输出类的属性
class Banana(Fruit):  #定义派生类香蕉
    color = "yellow"
    def __init__(self):
        print("我是香蕉")
        super().__init__()#调用时并没有输出,只是传color,基类默认的
class Pear(Fruit):     #定义派生类梨
    #color = "cyan"
    def __init__(self,color):
        print("\n我是梨")
        super().__init__(color)  # 调用时并没有输出,只是传color,更改基类默认的
    def harvest(self,color):#重写方法
        print("梨的颜色是:" + color + "的!")
        print("梨收获了!")
        print("梨开始是:" + Fruit.color + "的!")  # 输出类的属性

banana = Banana()
banana.harvest(banana.color)
pear = Pear("cyan")   #创建类的实例
pear.harvest("yellow white")#调用基类的方法

输出结果参考:

今天先写学习到这里了,每天进步一点点。明天也要加油啊!

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

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

相关文章

PHP API 框架:构建高效API的利器

在当今快速发展的互联网时代,API(应用程序编程接口)已成为连接不同应用程序和服务的关键。PHP,作为一种流行的服务器端脚本语言,提供了多种强大的框架来简化API的开发。本文将介绍PHP API框架的重要性,以及…

嵌入式系统基础讲解

​ 大家好,我是程序员小羊! 前言: 嵌入式系统是计算机科学与电子工程的交叉领域,广泛应用于消费电子、工业控制、汽车、医疗设备等多个行业。嵌入式系统设计涉及硬件和软件的协同开发,要求开发者掌握多方面的基础知识。…

Tomcat系列漏洞复现

CVE-2017-12615——Tomcat put⽅法任意⽂件写⼊漏洞 漏洞描述 当 Tomcat运⾏在Windows操作系统时,且启⽤了HTTP PUT请求⽅法(例如,将 readonly初始化参数由默认值设置为false),攻击者将有可能可通过精⼼构造的攻击请求…

mybatis 配置文件完成增删改查(四) :多条件 动态sql查询

文章目录 就是你在接收数据时,有的查询条件不写,也能从查到相应的stauts也可能为空恒等式标签 代替where关键字 就是你在接收数据时,有的查询条件不写,也能从查到相应的 注意是写字段名 还是 属性名 companyName不写也能查出满足…

K8s容器运行时,移除Dockershim后存在哪些疑惑?

K8s容器运行时,移除Dockershim后存在哪些疑惑? 大家好,我是秋意零。 K8s版本截止目前(24/09)已经发布到了1.31.x版本。早在K8s版本从1.24.x起(22/05),默认的容器运行时就不再是Doc…

车载测试项目实操学习:CAN通信测试、UDS诊断测试、自动化测试、功能安全测试、CAN一致性测试、HIL测试:9-20

FOTA模块中OTA的知识点:1.测试过程中发现哪几类问题? 可能就是一个单键的ecu,比如升了一个门的ecu,他的升了之后就关不上,还有就是升级组合ecu的时候,c屏上不显示进度条。 2.在做ota测试的过程中&#xff…

【d46】【Java】【力扣】876.链表的中间结点

思路 先获得总体长度, 再得到中间节点 的索引,,这里的索引是从1开始的索引,而不是从0开始的索引(这种理解方式更简单) 排错:另一个思路:将链表都放进list,获得中间的数字,然后遍历…

AIGC8: 高通骁龙AIPC开发者大会记录B

图中是一个小男孩在市场卖他的作品。 AI应用开发出来之后,无论是个人开发者还是企业开发者。 如何推广分发是面临的大问题。 做出来的东西一定要符合商业规律。否则就是实验室里面的玩物,或者自嗨的东西。 背景 上次是回顾和思考前面两个硬件营销总的…

【PSINS工具箱】159联邦滤波器|优化后的MATLAB代码

文章目录 程序说明概述主要功能代码结构关键函数 运行结果与解析程序代码 程序说明 概述 该程序实现了一个联邦滤波器的仿真,结合了惯性导航系统(SINS)、全球导航卫星系统(GNSS)和中央导航系统(CNS&#…

Gin框架入门(2)--异常捕获与日志实现

异常捕获 Go语言的异常捕获采用的是延迟处理的方法实现的,实际上就是利用defer,panic和recover三个关键字和函数来实现的。 关键字 defer关键字(函数) 这个关键字在控制语句中就有所涉及,本质上是采用一个栈的存储结构,在整个…

ffmpeg面向对象——参数配置机制探索及其设计模式

目录概览 0.参数配置对象流程图0.1 用到的设计模式0.2 与朴素思想的对比 1.参数传递部分1.1 AVDictionary字典容器类1.1.1 类定义及类图1.1.2 构造函数1.1.3 析构函数1.1.4 设置/读取等配置参数 1.2 参数配置实例 2.参数配置生效部分2.1 参数过滤模块2.1.1 AVOption类2.1.1.1 类…

2024-09-18 实操层面理解进程

一、进程初探 # ps ajx | head -1PPID PID PGID SID TTY TPGID STAT UID TIME COMMANDroothcss-ecs:~# ps ajx | head -1; ps ajx | grep procPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND24696 24707 24707 24679 …

串的存储实现方法(与链表相关)

一、 定义 字符串是由零个(空串)或多个字符组成的有限序列。 eg:S"Hello World!" 串相等:两个串长度相等并且对应位置的字符都相等时,两个串才相等。 二、串的存储实现 2.1 定长顺序串 2.2 堆串 和定长顺序串的…

【速成Redis】01 Redis简介及windows上如何安装redis

前言: 适用于:需要快速掌握redis技能的人(比如我),在b站,找了个课看。 01.课程简介_哔哩哔哩_bilibili01.课程简介是【GeekHour】一小时Redis教程的第1集视频,该合集共计19集,视频…

乐橙云平台接入SVMSPro平台

乐橙云平台接入SVMSPro平台 步骤一:进入乐橙开放平台:https://open.imoulife.com/ ,点右上角的登陆,填写自己的用户名密码,进入控制台; 步骤二:登陆进去后,我的应用—>应用信息&a…

Fyne ( go跨平台GUI )中文文档- 架构 (八)完结

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章: Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

Java集合HashSet——HashSet在底层原理

可点击此处:HashSet在底层原理 创建一个默认长度16,默认加载因子为0.75的数组,数组名table 16*0.75 12,如果存入的数据达到12,则数组自动扩容为原来的2倍 根据元素的哈希值跟数组的长度计算出应存入的位置 int index…

JAVA基础:正则表达式,String的intern方法,StringBuilder可变字符串特点与应用,+连接字符串特点

1 String中的常用方法2 1.1 split方法 将字符串按照指定的内容进行分割,将分割成的每一个子部分组成一个数组 分割内容不会出现在数组中 实际上该方法不是按照指定的简单的符号进行分割的,而是按照正则表达式进行分割 1.2 正则表达式 用简单的符号组合…

思维商业篇(4)—产业上下游定

思维商业篇(4)—产业上下游定位(微笑曲线) 产业上下游定位,帮助我们去观察一个企业在产业上下游中处于一个什么样的生态位。 上游 处于产业链开始端,百川东到海,百川的的起始端就是上游,东到海的海就是下游。 处在上游的企业一…

用友网络交付总监刘伟伟受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 用友网络科技股份有限公司区域交付总监刘伟伟先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾,演讲议题为“如何有效提升项目经理领导力”。大会将于10月26-27日在北京举办,主…