面向对象编程-继承

news2025/1/10 1:34:42

目录

一、为什么需要继承

二、继承的基本介绍

1、继承的基本介绍

2、继承示意图

3、继承的基本语法

三、快速入门

四、继承的使用细节

五、练习


一、为什么需要继承

1、一个小问题,还是看程序,提出代码复用问题

1)我们编写两个类,一个是Pupil类(小学生),一个是Graduate(大学毕业生)

2)问题:两个类的属性和方法有很多是相同的,怎么办?

# 没有使用继承前的代码

# 小学生类
class Pupil:
    name=None
    age=None
    __score=None

    def __init__(self,name,age):
        self.name=name
        self.age=age

    def show_info(self):
        print(f"name={self.name} age={self.age} score={self.__score}")

    def set_score(self,score):
        self.__score=score

    def testing(self):
        print("小学生在考小学数学...")

# 大学生类
class Graduate:
    name = None
    age = None
    __score = None

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def show_info(self):
        print(f"name={self.name} age={self.age} score={self.__score}")

    def set_score(self, score):
        self.__score = score

    def testing(self):
        print("大学生在考高等数学...")

# 测试
student1=Pupil("apple",10)
student1.testing()
student1.set_score(70)
student1.show_info()

print("-------------")
student2=Graduate("grape",20)
student2.testing()
student2.set_score(80)
student2.show_info()

2、问题分析

1)Pupil和Graduate有很多相同的属性和方法

2)目前这样的做法,代码复用性差,同时也不利于代码的维护和管理

二、继承的基本介绍

1、继承的基本介绍

1)继承可以解决代码复用,让我们的编程更加靠近人类的思维

2)当多个类存在相同的属性和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有子类不需要重新定义这些属性和方法

2、继承示意图

3、继承的基本语法

class 子类名(父类名):

        .........

        .........

1)派生类就会自动拥有基类定义的属性和方法

2)基类习惯上也叫父类

3)派生类习惯上也叫子类

三、快速入门

# 使用继承代码
class Student:
    name = None
    age = None
    __score = None

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def show_info(self):
        print(f"name={self.name} age={self.age} score={self.__score}")

    def set_score(self, score):
        self.__score = score

# 小学生类
class Pupil(Student):
    def testing(self):
        print("小学生在考小学数学...")

# 大学生类
class Graduate(Student):
    def testing(self):
        print("大学生在考高等数学...")

# 测试
student1=Pupil("apple",10)
student1.testing()
student1.set_score(70)
student1.show_info()

print("-------------")
student2=Graduate("grape",20)
student2.testing()
student2.set_score(80)
student2.show_info()

继承给编程带来的便利

1)代码的复用性提高了

2)代码的扩展性和维护性提高了

四、继承的使用细节

1、子类继承了父类所有的属性和方法,非私有属性和方法可以在子类直接访问,但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问

class Base:
    # 公共属性
    n1=100
    # 私有属性
    __n2=200

    def __init__(self):
        print("Base构造方法...")

    def hi(self):
        print("hi()公共方法")

    def __hello(self):
        print("__hello()私有方法")

class Sub(Base):
    def __init__(self):
        print("Sub构造方法...")

    def say_ok(self):
        # 父类的非私有属性和方法可以访问
        print("say_ok()",self.n1)
        self.hi()

        # 父类的私有属性和方法不可以访问
        # print(self.n2)
        # self.__hello()

sub=Sub()
sub.say_ok()

2、Python编程语言中,"object"是所有其它类的基类,通过ctrl+H可以查看类的继承关系

3、Python支持多重继承

class 子类(父类1,父类2,父类3....):

        ...........

        ...........

# 多重继承
class A:
    n1=100

    def sing(self):
        print("A sing()...",self.n1)

class B:
    n2=200

    def dance(self):
        print("B dance()...",self.n2)

class C(A,B):
    # Python中,pass是空语句,是为了保持程序结构的完整性
    # pass 不做任意事情,一般是做占位语句
    pass

c=C()
print(f"属性信息:{c.n1} {c.n2} ")
c.sing()
c.dance()

4、在多重继承中,如果有同名的成员,遵循从左到右的继承优先级(即:左边的父类优先级高,右边的父类优先级低)

五、练习

编写Computer类,包含CPU、内存、硬盘等属性

1)get_details方法用于返回Computer的详细信息

2)编写PC子类,继承Computer类,添加特有属性(品牌brand)

3)完成测试,创建PC对象,给对象中的特有属性赋值,以及从Computer类继承的属性赋值,并使用方法打印输出信息

"""
    思路分析:
    1、父类:Computer
    2、公共属性:CPU(cpu)、内存(memory)、硬盘(disk)
    3、构造方法:__init__(self,cpu,memory,disk)
    4、方法:get_details(self)
    5、子类:PC(Computer)
    6、特有属性:brand
    7、构造方法:__init__(self,cpu,memory,disk,brand)
    8、方法:print_info(self)完成功能:输出pc对象的信息(即属性信息)
"""
class Computer:
    cpu=None
    memory=None
    disk=None

    def __init__(self,cpu,memory,disk):
        self.cpu=cpu
        self.memory=memory
        self.disk=disk

    def get_details(self):
        return f"cpu:{self.cpu}\t内存:{self.memory}\t硬盘:{self.disk}"

class PC(Computer):
    brand=None

    """
        解读:
        1、通过super().xx方式可以去调用父类的方法
        2、super.__init__(cpu,memory,disk)调用父类方构造器,完成对父类属性的初始化
        3、self.brand=brand表示子类特有属性,由子类的构造器完成初始化
    """
    def __init__(self,cpu,memory,disk,brand):
        super().__init__(cpu,memory,disk)
        self.brand=brand

    def print_info(self):
        # 完成打印当前对象的信息
        print(f"品牌:{self.brand}\t{self.get_details()}")

# 测试
pc=PC("intel",32,1000,"戴尔")
pc.print_info()

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

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

相关文章

【AI 绘画】Q版人物定制生成

AI 绘画-PulID手办定制 1. 效果展示 本次测试主要结果展示如下: 牛仔风 古风 2. 基本原理 PuLID是一种类似于 ip-adapter 的恢复面部特征的方法。它同时使用 insightface 嵌入和 CLIP 嵌入,类似于 ip-adapter faceid plus 模型所做的。但是,在将图像传递给 CLIP 之前,还…

8.看门狗(WDG)

理论 防止系统跑飞 喂狗:让值为0 分类:独立看门狗(IWDG,0到100喂狗)、窗口看门狗(60到100喂狗),值(60),顶值(100) 代码编写 按键喂狗 独立看门狗配置 超过10s,复位 注意时钟: 按键、LED灯配置参考&#x…

sql注入实战——thinkPHP

sql注入实战——thinkPHP sql注入实战——thinkPHPthinkPHP前期环境搭建创建数据库开始寻找漏洞点输入SQL注入语句漏洞分析 实验错误 sql注入实战——thinkPHP thinkPHP前期环境搭建 下载thinkPHP文件 解压,将framework关键文件放到think-5.0.15中,改…

Containerd详解

一.Containerd概述 1.什么是Containerd Containerd (container Daemon)是一个开源的容器运行时,它提供了一种标准化的方式来管理容器的生命周期。该项目最初是由Docker开发团队创建的,并在后来成为一个独立的项目,被纳入了Cloud Native Comp…

播放视频时黑屏无报错或报错“播放失败,请检查设备及客户端网络”

播放视频时黑屏无报错或报错“播放失败,请检查设备及客户端网络”或该如何解决? 请先使用排障工具排查,获得具体错误码,排障工具操作文档详见: 播放失败自助排障及常见错误码解决方案 - 播放问题 - 萤石社区 - Powered…

Linux下查看各进程的swap

cat /etc/re*se Red Hat Enterprise Linux Server release 6.8 (Santiago) 简单的可以通过top命令查看 top 后 按 f 进入选择列界面 按 p 就会输出swap信息(变为P) 回车返回看到SWAP信息了 再按 F 再按p 按swap排序 再回车后就是各进程按swap排序…

工厂数据采集设备的革新与应用-天拓四方

随着工业4.0和智能制造的快速发展,工厂数据采集设备已成为现代制造业不可或缺的重要组成部分。这些设备不仅提高了生产效率,还通过精准的数据分析为企业的决策提供了有力支持。本文将深入探讨工厂数据采集设备的革新、应用及其在实际操作中的重要性。 一…

论文利器 | 6款论文自动生成免费含摘要文献综述

在学术写作中,选择合适的工具和软件可以大大提高写作效率和质量。本文将重点介绍一款备受推荐的AI原创论文写作平台——千笔-AIPassPaPer,并详细分析其功能和优势。 千笔-AIPassPaPer简介 千笔-AIPassPaPer是一款功能全面且高效的AI原创论文写作平台&a…

注意力机制篇 | YOLOv8改进之引入NAMAttention注意力机制 | 基于标准化的注意力模块

前言:Hello大家好,我是小哥谈。本文提出一种基于归一化的注意力模块(NAM),可以降低不太显著的特征的权重,这种方式在注意力模块上应用了稀疏的权重惩罚,这使得这些权重在计算上更加高效,同时能够保持同样的性能。我们在ResNet和MobileNet上和其他的注意力方式进行了对比…

基于springboot的乐享田园系统

TOC springboot181基于springboot的乐享田园系统 第1章 绪论** 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不…

线程的退出、资源回收,互斥锁

创建多个线程,用循环的方式: 一、线程结束方式 1、pthread_exit(void *) 2、pthread_return 3、pthread_cancle:异常退出,无法获得退出状态,只能回收资源。 程序实例: 二、线程资…

异构数据同步 datax (1)

阿里实现异构数据库之间的表数据集同步 Reader & Framework & Writer job 当然好用的框架,自然有很多优点 1)可靠的数据质量监控 2) 丰富的数据转换功能 DataX作为一个服务于大数据的ETL工具,除了提供数据快照搬迁功能之外&#…

Gather在全球隐私保护领域的先锋地位

随着全球数字化进程的加速,隐私保护已成为各国政府、企业以及个人用户的共同关注点。近年来,频发的数据泄露事件和隐私侵害问题,让用户对安全通信和隐私保护的需求愈发强烈。据 IBM Security 统计,2024 年全球数据泄露的平均成本为…

C语言程序设计-[21] 字符串处理函数

C语言程序库中提供了一些专门处理字符串的函数: gets(字符数组); 输入一行字符序列到字符数组puts(字符串); 将字符串输出到终端strcat(字符数组1,字符串2); 字符串连接strcpy(字符数组1,字符串2); 复制字符串strcmp(字符串1, 字符串2); 两个字符串比较s…

【Kubernetes】k8s集群对外服务之Ingress

目录 一.Ingress 概述 1.什么是ingress 2.外部应用访问集群内部服务的方案 3.ingress 组成 4.ingress-Nginx 工作原理 二.部署 nginx-ingress-controller 方式一 方式二 三.总结 一.Ingress 概述 1.什么是ingress service的作用体现在两个方面,①对集群内…

AI初级教程-AI到底有什么样的具体价值

一、开头放重点 一个在国内好用且免费的AI工具,可以让自己的学习或者工作方面,事半功倍! 🔥世界主流大模型集聚地 免魔法 白玩GPT4 AI智能工作流 Codemoss_能用AI 传送门:https://www.nyai.chat/chat?inviteny…

第三方软件测试机构如何通过测试保障软件产品质量?

在当今数字化快速发展的时代,软件的质量直接影响至关重要的业务性能和用户体验。卓码软件测评作为一家专业的第三方软件测试机构,深知高质量软件对企业成功的重要性,那么是如何保障软件产品质量呢?主要有以下方式: 一…

具有重新参数化异构卷积的多分支辅助融合YOLO,用于精确的目标检测(MAF-YOLO)

中英文对照阅读https://yiyibooks.cn/arxiv/2407.04381v1/index.html 摘要 由于多尺度特征融合的有效性能,路径聚合 FPN (PAFPN) 被广泛应用于 YOLO 检测器中。 然而,它不能有效地、自适应地同时集成高层语义信息和低层空间信息。 我们在本文中提出了一…

Spring boot logback日志框架加载初始化源码

##LoggingApplicationListener监听 Overridepublic void onApplicationEvent(ApplicationEvent event) {if (event instanceof ApplicationStartingEvent) {onApplicationStartingEvent((ApplicationStartingEvent) event);}else if (event instanceof ApplicationEnvironment…

java中List列表转成子父集列表

一、前言 在Java中,如果你有一个表示父子关系的列表,并且想要把这个列表转成一个子父集list列表树目录,一般来说想要把list列表转成一个子父集列表,这个对象需要在属性中必须要有几个字段,id(节点id&#x…