Python小白学习教程从入门到入坑------第二十四课 继承(语法进阶)

一、继承

继承就是让类和类之间转变为父子关系,子类默认继承父类的属性和方法

在Python中,继承是一个非常强大的特性,它允许我们创建一个新的类(称为子类),这个新类可以继承另一个类(称为父类或基类)的属性和方法

这样,子类就可以复用父类的代码,同时还可以添加新的属性和方法或者重写父类的方法来实现特定的功能

想象一下,你有一个“动物”类,这个类描述了所有动物共有的属性和方法,比如“吃”和“呼吸”

然后,你想创建一个特定的动物类,比如“狗”,狗也是动物,所以它应该继承“动物”类的所有属性和方法,但同时,狗还有一些特有的属性和方法,比如“叫”和“摇尾巴”

通过继承,你可以这样做:

首先,定义一个“动物”类,包含所有动物共有的属性和方法

然后,定义一个“狗”类,让它继承自“动物”类。这样,“狗”类就自动拥有了“动物”类的所有属性和方法

最后,你可以在“狗”类中添加狗特有的属性和方法

1.1 语法

class 类名(父类名):代码块...

注意:继承分为单继承和多继承

1.2 单继承

单继承是指一个子类只继承一个父类的情况

这是最简单、最直接的继承方式

在单继承中,子类可以访问父类的所有公开(public)和受保护(protected)成员(属性和方法),但不能直接访问私有(private)成员(通常以双下划线__开头的成员名)

不过,通过一些特殊的方法(如名称修饰),子类仍然可以间接地访问这些私有成员

eg:

class Person:     # 父类def eat(self):print("我会吃饭")def sing(self):print("我是唱歌小能手")
class Girl(Person):   # Person类的子类pass    # 占位符,代码里面类下面不写任何东西,会自动跳过,不会报错
class Boy(Person):   # Person类的子类pass
girl = Girl()
girl.eat()
girl.sing()
# 输出内容:
# 我会吃饭
# 我是唱歌小能手
boy = Boy()
boy.eat()
boy.sing()
# 输出内容:
# 我会吃饭
# 我是唱歌小能手
# 总结:子类可以继承父类的属性和方法,就算子类自己没有,也可以使用父类的。

1.3 继承的传递(多重继承)

A/B/C  C(子类) 继承于B(父类), B类 (子类) 继承A类 (父类), C类具有 A/B 类的属性和方法

子类拥有父类的父类的属性和方法

eg:

class Father:    # 父类def eat(self):print("吃饭")def sleep(self):print("睡觉")
class Son(Father):    # Father类的子类pass
class Grandson(Son):  # Son的子类pass
grandson = Grandson()
grandson.eat()
grandson.sleep()
# 输出结果:
# 吃饭
# 睡觉

1.4 方法的重写

含义:如果从父类继承的方法不能满足子类的需求,可以在子类中重写父类的方法,这个过程称为方法的覆盖,也称为方法的重写;

1.4.1 覆盖父类方法

eg:

class Person:   # 父类def money(self):print("一百万需要被继承")
class Man(Person):  # 子类def money(self):print("自己赚一千万")
man = Man()
man.money()
# 输出结果:自己赚一千万

1.4.2 对父类方法进行扩展

继承父类的方法,子类也可以增加自己的功能

实现对父类方法进行扩展的三种方式:

1. 父类名.方法名(self)

2. super().方法名()  -----推荐使用

3. super(子类名,self)方法名

接下来通过代码详细解释一下这三种方式:

1. 父类名.方法名(self)

eg:

class Parent:  def some_method(self):  print("Parent method")  class Child(Parent):  def some_method(self):  # 调用父类方法  Parent.some_method(self)  # 添加子类特有的逻辑  print("Child method")  # 测试  
child = Child()  
child.some_method()

输出结果:

Parent method  
Child method

优点:简单直接,易于理解

缺点:如果父类名被更改或继承结构变得复杂,这种方式可能会变得难以维护

2. super().方法名()  -----推荐使用

super在python里面是一个特殊的类,super()是使用super类创建出来的对象,可以调用父类中的方法

eg:

class Parent:  def some_method(self):  print("Parent method")  class Child(Parent):  def some_method(self):  # 调用父类方法  super().some_method()  # 添加子类特有的逻辑  print("Child method")  # 测试  
child = Child()  
child.some_method()

输出结果:

Parent method  
Child method

优点:

1、自动处理多重继承中的方法解析顺序(MRO)

2、更容易维护,特别是当涉及多重继承时

缺点:稍微比直接调用父类方法复杂一点,但通常这种复杂性是值得的。

3. super(子类名,self). 方法名

这是 super() 的另一种形式,明确指定了子类和实例

虽然这在某些情况下可能有用,但通常不推荐使用,因为 super() 已经足够,并且更简洁

class Parent:  def some_method(self):  print("Parent method")  class Child(Parent):  def some_method(self):  # 调用父类方法  super(Child, self).some_method()  # 添加子类特有的逻辑  print("Child method")  # 测试  
child = Child()  
child.some_method()

输出内容:

Parent method  
Child method

优点:在某些需要明确指定子类和实例的复杂情况下可能有用

缺点:

1、冗长且容易出错

2、不如 super() 直观和简洁

二、新式类写法

python3中如果一个类没有继承任何类,则默认继承object类,因此python3都是新式类

2.1 第一种经典类

格式:

class A:     # 经典类:不由任意内置类型派生出的类pass

那么什么是派生类什么是非派生类呢?

常常是那种继承父类又改变了父类的属性或者方法的类就称为派生类(简单来说就是有不同于父类的就是派生类)

eg1:非派生类

class Animal:def walk(self):print("我会走路")
class Dog(Animal):   # 非派生类,完全继承父类的方法pass

 eg2:派生类

class Animal:def walk(self):print("我会走路")
class Dog(Animal):   # 派生类,在继承父类方法的基础上新增了自己的方法def bite(self):print("会咬人") 

2.2 第二种经典类

格式:class A ()

在Python中,class A() 定义了一个名为 A 的空类。这里,A 是类名,而括号 () 表示这个类是从哪个基类(或父类)继承而来的。由于在这个例子中括号内为空,A 默认从Python的内置基类 object 继承。

2.3 新式类 (推荐使用)

格式:class  A(object)

新式类:继承了object类或者该类的子类都是新式类

object:对象,Python为所有对象提供的基类(顶级父类),提供了一些内置的属性和方法,可以用dir()查看

eg:

print(dir(object))

输出内容:

['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

三、多继承

在Python中,多继承是指一个类可以从多个基类(父类)继承属性和方法,并且具有所有父类的属性和方法

这是面向对象编程(OOP)的一个强大特性,允许类组合多个父类的功能,从而创建更灵活和可重用的代码结构

3.1 子类可以拥有多个父类,并且具有所有父类的属性和方法

eg:

class Father(object):   # 父类一def money(self):print("拥有一百万遗产需要被继承")
class Mother(object):   # 父类二def appearance(self):print("绝世容颜需要被继承")
class Son(Father,Mother):pass
son = Son()
son.money()
son.appearance()
# 输出结果:
# 拥有一百万遗产需要被继承
# 绝世容颜需要被继承

3.2 不同的父类存在同名的方法

注意:开发时应尽量避免此类情况,有多个父类的属性和方法如果多个父类具有同名方法的时候,调用就近原则

eg:Father类在前,Mother类在后

class Father(object):   # 父类一def money(self):print("拥有一百万遗产需要被继承")
class Mother(object):   # 父类二def money(self):print("拥有一百二十万遗产需要被继承")def appearance(self):print("绝世容颜需要被继承")
class Son(Father,Mother):pass
son = Son()
son.money()
son.appearance()
# 输出结果:
# 拥有一百万遗产需要被继承
# 绝世容颜需要被继承

eg:Mother类在前,Father类在后

class Father(object):   # 父类一def money(self):print("拥有一百万遗产需要被继承")
class Mother(object):   # 父类二def money(self):print("拥有一百二十万遗产需要被继承")def appearance(self):print("绝世容颜需要被继承")
class Son(Mother,Father):pass
son = Son()
son.money()
son.appearance()
# 输出结果:
# 拥有一百二十万遗产需要被继承
# 绝世容颜需要被继承

3.3 方法的搜索顺序(了解)

python中内置的属性__mro__可以查看方法搜索顺序

搜索方法时,会先按照__mro__的输出结果,从左往右的顺序查找

如果在当前类中找到了方法,就直接执行,不再搜索

如果找到最后一个类,还没有找到这个方法,程序就会报错

eg:

class Father(object):   # 父类一def money(self):print("拥有一百万遗产需要被继承")
class Mother(object):   # 父类二def money(self):print("拥有一百二十万遗产需要被继承")def appearance(self):print("绝世容颜需要被继承")
class Son(Mother,Father):def money(self):print("拥有十万")
son = Son()
son.money()
son.appearance()
print(Son.__mro__)
# 输出结果:
# 拥有十万
# 绝世容颜需要被继承
# (<class '__main__.Son'>, <class '__main__.Mother'>, <class '__main__.Father'>, <class 'object'>)

今天的分享就到这里了,有错误的地方欢迎大家指出,希望能够帮助到大家~

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

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

相关文章

玩转HF/魔搭/魔乐社区(作业)

任务描述时间模型下载使用Hugging Face平台、魔搭社区平台&#xff08;可选&#xff09;和魔乐社区平台&#xff08;可选&#xff09;下载文档中提到的模型&#xff08;至少需要下载config.json文件、model.safetensors.index.json文件&#xff09;&#xff0c;请在必要的步骤以…

QT——记事本项目

目录 1.给pushButton按键添加图片 1.1 首先复制存放图片的文件夹&#xff0c;打开Qt回到编辑页面&#xff0c;右键单击pro文件选择在Explorer中显示&#xff0c;将图片文件夹粘贴进去你的代码同目录即可 1.2 创建一个新的文件夹 1.3 点击Add Files&#xff0c;将所有图片添加…

Redis-“自动分片、一定程度的高可用性”(sharding水平拆分、failover故障转移)特性(Sentinel、Cluster)

文章目录 零、写在前面一、水平拆分(sharding/分片)、故障转移(failover)机制介绍水平拆分&#xff08;Sharding&#xff09;故障转移机制 二、Redis的水平拆分的机制有关的配置1. 环境准备2. 配置文件配置3. 启动所有Redis实例4. 创建集群5. 测试集群读/写6. 集群管理 三、Red…

OpenCV视觉分析之目标跟踪(7)目标跟踪器类TrackerVit的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 VIT 跟踪器由于特殊的模型结构而变得更快且极其轻量级&#xff0c;模型文件大约为 767KB。模型下载链接&#xff1a;https://github.com/opencv/…

yolov8训练及测试(ubuntu18.04、tensorrt、ros)

1 数据集制作 1.1标注数据 Linux/Ubuntu/Mac 至少需要 Python 2.6 &#xff08;推荐使用 Python 3 或更高版本 及 PyQt5&#xff09; Ubuntu Linux (Python 3 Qt5) git clone https://gitcode.com/gh_mirrors/la/labelImg.git sudo apt-get install pyqt5-dev-tools cd lab…

海睿思产品体系二次开发能力介绍

海睿思产品体系支持用户通过编写开发代码&#xff08;含低代码&#xff09;&#xff0c;提供定制化功能&#xff0c;解决数据治理和共享场景的个性化需求。 1、数据集成 应用场景&#xff1a;自定义数据集成能力 开发语言&#xff1a;JAVA 使用效果&#xff1a; 1&#xff…

SpringMVC笔记 一万字

此笔记来自于B站尚硅谷 文章目录 一、SpringMVC 简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式&#xff1a;warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求…

Maven随笔

文章目录 1、什么是MAVEN2、Maven模型3、Maven仓库4、项目集成1_Idea集成Maven设置2_创建Maven项目3_POM配置详解4_maven 坐标详情5_Maven工程类型6_导入Maven项目 5、依赖管理1_依赖配置2_依赖传递3_可选依赖4_排除依赖4_可选依赖和排除依赖的区别5_依赖范围6_继承与聚合7_版本…

看门狗有什么用?

看门狗(WATCH-DOG Timer)全称看门狗定时器 用途&#xff1a;防止程序死机&#xff08;主要用途&#xff09; 或 单纯用来计时 直接上代码&#xff1a; 只要程序可以正常运行&#xff0c;看门狗就会清零&#xff0c;如果崩了&#xff0c;看门狗就会复位程序

云原生开源开发者沙龙丨AI 应用工程化专场杭州站邀您参会

云原生开源开发者沙龙 AI 原生应用架构专场&#xff0c;邀您一起交流&#xff0c;探索 AI 原生应用的工程化落地&#xff01; 活动简介 AI 驱动的应用程序开发、部署和运维&#xff0c;给应用带来了新的生命力和想象空间。但大部分开发者对 AI 应用的编程框架、可观测体系、网…

UFO:Windows操作系统的具象智能代理

近年来&#xff0c;随着AI技术的发展&#xff0c;智能代理在各种应用中扮演着越来越重要的角色。微软推出的UFO&#xff08;User-Focused Operator&#xff09;正是这样一个出色的多代理框架&#xff0c;旨在通过无缝导航和操作&#xff0c;满足用户在Windows操作系统中跨多个应…

基于人工智能的搜索和推荐系统

互联网上的搜索历史分析和用户活动是个性化推荐的基础&#xff0c;这些推荐已成为电子商务行业和在线业务的强大营销工具。随着人工智能的使用&#xff0c;在线搜索也在改进&#xff0c;因为它会根据用户的视觉偏好提出建议&#xff0c;而不是根据每个客户的需求和偏好量身定制…

使用ffmpeg和mediamtx模拟多通道rtsp相机

首先下载ffmpeg&#xff0c;在windows系统上直接下载可执行文件&#xff0c;并配置环境变量即可在命令行当中调用执行。 下载地址&#xff1a; https://ffmpeg.org/再在github上下载mediamtx搭建rtsp服务器&#xff0c;使用ffmpeg将码流推流到rtsp服务器。 下载地址&#xff1…

Spring Boot框架:校园社团信息管理的现代化解决方案

3系统分析 3.1可行性分析 通过对本校园社团信息管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本校园社团信息管理系统采用SSM框架&#xff0c;JAVA作…

软件测试面试八股文个人总结

一、软件测试基础面试题 1、阐述软件生命周期都有哪些阶段? 常见的软件生命周期模型有哪些? 软件生命周期是指一个计算机软件从功能确定设计&#xff0c;到开发成功投入使用&#xff0c;并在使用中不断地修改、增补和完善&#xff0c;直到停止该软件的使用的全过程(从酝酿到…

彻底理解链表(LinkedList)结构

目录 比较操作结构封装单向链表实现面试题 循环链表实现 双向链表实现 链表&#xff08;Linked List&#xff09;是一种线性数据结构&#xff0c;由一组节点&#xff08;Node&#xff09;组成&#xff0c;每个节点包含两个部分&#xff1a;数据域&#xff08;存储数据&#xff…

C#/.NET/.NET Core优秀项目和框架2024年10月简报

前言 每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架&#xff08;每周至少会推荐两个优秀的项目和框架当然节假日除外&#xff09;&#xff0c;推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等&#xff08;打不开或者打开GitHub很慢的同学可以优先查看…

数据库作业5

1&#xff0c;建立触发器&#xff0c;订单表中增加订单数量后&#xff0c;商品表商品数量同步减少对应的商品订单出数量,并测试 测试&#xff1a; 2.建立触发器&#xff0c;实现功能:客户取消订单&#xff0c;恢复商品表对应商品的数量 测试 3.建立触发器&#xff0c;实现功能:…

证书下行,这些高质量IT证书仍值得考

在快速变化的信息技术领域&#xff0c;专业认证不仅证明了个人的专业技能&#xff0c;还常常是许多企业在招聘时考虑的重要标准&#xff0c;因此很多IT朋友都会选择考一本证书来傍身。 然而&#xff0c;随着技术的发展和市场的变化&#xff0c;并不是所有的IT证书都能保持其原有…

华为荣耀曲面屏手机下面空白部分设置颜色的方法

荣耀部分机型下面有一块空白区域&#xff0c;如下图红框部分 设置这部分的颜色需要在themes.xml里面设置navigationBarColor属性 <item name"android:navigationBarColor">android:color/white</item>