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.mzph.cn/bicheng/59285.shtml

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

相关文章

【django】RESTful API 设计指南

目录 一、协议 二、域名 三、版本&#xff08;Versioning&#xff09; 四、路径&#xff08;Endpoint&#xff09; 五、HTTP动词 5.1 CRUD操作&#xff1a; 5.2 其他动词&#xff1a; 六、过滤信息&#xff08;Filtering&#xff09; 七、状态码&#xff08;Status Co…

【综合算法学习】(第十六篇)

目录 岛屿的最⼤⾯积&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 被围绕的区域&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 岛屿的最⼤⾯积&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xf…

django的一些文件

~~~settings.py~~~ # 接口文档相关配置 REST_FRAMEWORK{ DEFAULT_SCHEMA_CLASS: rest_framework.schemas.coreapi.AutoSchema, } ~~~urls.py~~~ from rest_framework.documentation import include_docs_urls # 模块coreapi,只针对drf的接口文档 path(api-docs/, i…

qt QTabWidget详解

1、概述 QTabWidget是Qt框架中的一个控件&#xff0c;它提供了一个标签页式的界面&#xff0c;允许用户在不同的页面&#xff08;或称为标签&#xff09;之间切换。每个页面都可以包含不同的内容&#xff0c;如文本、图像、按钮或其他小部件。QTabWidget非常适合用于创建具有多…

用ChatGPT提升工作效率:从理论到实际应用

伴人工智能技术的迅速演进&#xff0c;像ChatGPT这类语言模型已成为提升工作效率的关键工具。这类模型不仅具备处理海量数据的能力&#xff0c;还能自动化许多日常任务&#xff0c;从而提高决策的准确性。本文将深入探讨如何在工作中利用ChatGPT等AI工具提升效率&#xff0c;涵…

VScode调试

VScode只是一个代码编辑器&#xff0c;下面我们使用VScode调试运行在远端连接Linux服务器的代码。 打断点 编译代码&#xff0c;要确保已经安装gdb&#xff0c;可以使用指令gdb --version 来检查 GDB 是否已安装以及安装的版本&#xff0c;确认安装后在编译时要加上选项&…

成都睿明智科技有限公司正规吗靠谱吗?

在这个短视频风起云涌的时代&#xff0c;抖音电商以其独特的魅力&#xff0c;成为了无数商家竞相追逐的新蓝海。而在这片浩瀚的商海中&#xff0c;成都睿明智科技有限公司犹如一艘装备精良的航船&#xff0c;引领着众多企业破浪前行&#xff0c;探索抖音电商的无限可能。今天&a…

Web Broker(Web服务应用程序)入门教程(1)

1、介绍 Web Broker 组件&#xff08;位于工具面板的“Internet”选项卡中&#xff09;可以帮助您创建与特定统一资源标识符&#xff08;URI&#xff09;相关联的事件处理程序。当处理完成后&#xff0c;您可以通过编程方式构建 HTML 或 XML 文档&#xff0c;并将它们传输给客…

PySpark Yarn集群模式

目录 简介 一、PySpark简介 二、YARN模式概述 三、配置环境 1. 安装与配置Spark 2. 配置Hadoop和YARN 3. 启动yarn 四、编写PySpark脚本 五、提交PySpark作业到YARN 参数解释&#xff1a; 六、常见问题及解决 七、总结 简介 随着大数据的普及&#xff0c;Spark作为…

<HarmonyOS第一课>HarmonyOS SDK开放能力简介的课后习题

不出户&#xff0c;知天下&#xff1b; 不窥牖&#xff0c;见天道。 其出弥远&#xff0c;其知弥少。 是以圣人不行而知&#xff0c;不见而明&#xff0c;不为而成。 本篇<HarmonyOS第一课>HarmonyOS SDK开放能力简介是简单介绍了HarmonyOS SDK&#xff0c;不需要大家过多…

【Java并发】乐观锁、悲观锁、CAS、版本号机制

前言 在现代计算机系统中&#xff0c;处理并发操作时&#xff0c;锁机制是至关重要的。本文将介绍乐观锁、悲观锁以及CAS&#xff08;Compare and Swap&#xff09;这三种常见的并发控制技术&#xff0c;帮助理解它们的原理和应用场景。 1.悲观锁 1.1 定义 悲观锁是一种在访…

三层交换技术,eNSP实验讲解

三层交换技术&#xff0c;eNSP实验讲解 一、简要介绍1、概念2、工作原理3、优点4、应用场景5、与路由器的区别 二、eNSP仿真实验1、步骤一&#xff1a;创建连接&#xff0c;明确参数。2、步骤二&#xff1a;设置PC1和PC2参数3、步骤三&#xff1a;配置交换机&#xff0c;通过命…

C++设计模式创建型模式———生成器模式

文章目录 一、引言二、生成器/建造者模式三、总结 一、引言 上一篇文章我们介绍了工厂模式&#xff0c;工厂模式的主要特点是生成对象。当对象较简单时&#xff0c;可以使用简单工厂模式或工厂模式&#xff1b;而当对象相对复杂时&#xff0c;则可以选择使用抽象工厂模式。 工…

Python 如何在 Web 环境中使用 Matplotlib 进行数据可视化

Python Matplotlib 在 Web 环境中的可视化 数据可视化是数据科学和分析中一个至关重要的部分&#xff0c;它能帮助我们更好地理解和解释数据。在现代应用中&#xff0c;越来越多的开发者希望能够将数据可视化结果展示在网页上。Matplotlib 是 Python 中最常用的数据可视化库之…

模型部署流程

神经网络部署流程 工业界应用神经网络时&#xff0c;往往要对学术界产出的模型进行优化&#xff0c;才能在推理设备/服务器上实现更高的效率&#xff0c;从而降低成本&#xff0c;这整个过程也一般称之为模型部署&#xff08;Deployment&#xff09;。 部署的目的 模型部署目…

vue2中使用vue-awesome-swiper实现轮播

swiper官方文档&#xff1a;Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 1.安装 注意&#xff1a;swiper和vue-awesome-swiper的版本一定一定一定要相对应&#xff0c;版本对应如下&#xff1a; Swiper 5-6 vue-awesome-swiper4.1.1(vue2) Swiper 4.x vue-awesome-swi…

less解决function中return写法在浏览器被识别成Object导致样式失败的问题

问题描述&#xff1a; 一开始写的是: baseFontSize: 37.5px;//基于屏幕尺寸/10得出的基准font-size// return失败,浏览器显示为[object Object],[object Object] .pxToRem(px){value: px / baseFontSize * 1rem;return value; } 使用height: .pxToRem(40px);之后浏览器却是这…

【04】【Maven项目热部署】将Maven项目热部署到远程tomcat服务器上

1.虽然现在Maven中央仓库中支持的tomcat插件只支持到tomcat7这个版本&#xff0c;但是可以利用这个插件对Web项目进行热部署&#xff0c;热部署到远程服务器的tomcat服务器上&#xff0c;远程服务器上的tomcat版本可以是更高的版本&#xff0c;比如说tomcat8、9、10或更高的版本…

开源一款前后端分离的企业级网站内容管理系统,支持站群管理、多平台静态化,多语言、全文检索的源码

大家好&#xff0c;我是一颗甜苞谷&#xff0c;今天分享一款前后端分离的企业级网站内容管理系统&#xff0c;支持站群管理、多平台静态化&#xff0c;多语言、全文检索的源码。 前言 在当今的数字化时代&#xff0c;企业网站和个人博客已成为信息传播和品牌建设的重要渠道。…

mfc | mfc集成opencv,实现摄像头监控、拍照、视频图像处理(亮度、对比度、色调、饱和度)功能

这里是引用 文章目录 一、开发环境二、MFC项目创建三、集成opencv3.1 opencv安装3.2 添加项目属性3.3 测试OpenCV&#xff08;打开摄像头&#xff09;3.4 OPENCV视频嵌入到弹框中 四、关闭摄像头、拍照功能实现4.1 添加按钮4.2 添加全局静态变量4.3 关闭摄像头功能实现4.4 拍照…