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'>)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【表格解决问题】EXCEL行数过多,WPS如何按逐行分别打印多个纸张中

1 问题描述 如图&#xff1a;我的表格行数太多了。打印在一张纸上有点不太好看 2 解决方式 Step01&#xff1a;先选中你需要打印的部分&#xff0c;找到【页面】->【打印区域】->【设置打印区域】 Step02&#xff1a;先选中一行&#xff0c;找到【插入分页符】 Step0…

提高交换网络可靠性之链路聚合

转载请注明出处 该实验为链路聚合的配置实验。 1.改名&#xff0c;分别将交换机1和交换机2改名为S1&#xff0c;S2&#xff0c;然后查看S1&#xff0c;S2的STP信息。以交换机1为例&#x1f447;。 2.交换机S1&#xff0c;S2上创建聚合端口&#xff0c;将端口加入聚合端口。以S…

SpringMVC笔记 一万字

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

【Hive sql面试题】找出连续活跃3天及以上的用户

表数据如下&#xff1a; 要求&#xff1a;求出连续活跃三天及以上的用户 建表语句和插入数据如下&#xff1a; create table t_useractive(uid string,dt string );insert into t_useractive values(A,2023-10-01 10:10:20),(A,2023-10-02 10:10:20),(A,2023-10-03 10:16…

livp是什么格式文件?这几款软件可以轻松处理!

今天&#xff0c;我们要探讨的是一种可能相对陌生但又颇具特色的文件格式——LIVP。它通常与某些特定的软件或设备相关联&#xff0c;比如某些品牌的相机或视频编辑软件。LIVP文件往往包含了丰富的图像或视频信息&#xff0c;以及与之相关的元数据&#xff08;如拍摄时间、地点…

贪心算法---java---黑马

贪心算法 1)Greedy algorithm 称之为贪心算法或者贪婪算法&#xff0c;核心思想是 将寻找最优解的问题分为若干个步骤每一步骤都采用贪心原则&#xff0c;选取当前最优解因为未考虑所有可能&#xff0c;局部最优的堆叠不一定得到最终解最优 贪心算法例子 Dijkstra while …

基于vue框架的的留守儿童帮扶管理系统c2691(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;留守儿童,帮扶活动,申请记录,帮扶机构,帮扶进度,帮扶人,申请加入记录,参与帮扶记录,地区信息 开题报告内容 基于Vue框架的留守儿童帮扶管理系统开题报告 一、研究背景与意义 在现代化进程中&#xff0c;随着城乡经济差异的不断扩大&a…

MySQL数据库迁移到DM8数据库

1. 达梦新建zsaqks库 2. 打开DM数据迁移工具 3. 新建工程 4. 迁移 - 右击 - 新建迁移 下一步 5. 选择迁移方式 6. MySQL数据源 请输入MySQL数据库信息 7. DM数据库目的 请输入达梦数据库信息 8. 迁移选项 保持对象名大小写(勾选) 9. 指定模式 指定是从数据源复制对象。 10.…

关于电脑蓝屏的那些解决方案--总有一款适合你

目录 背景内存检测硬盘检测拆机除尘上硅脂查看蓝屏日志--计算机管理1796事件进入bios启用安全启动状态创建转储期间出错失败蓝屏crystaldiskinfo查找BitLocker 恢复密钥关闭cpu-c步骤一&#xff1a;进入BIOS设置步骤二&#xff1a;找到CPU C-state设置步骤三&#xff1a;关闭CP…

HTML 语法规范——代码注释、缩进与格式、标签与属性、字符编码等

文章目录 一、代码注释1.1 使用注释的主要目的1.2 使用建议二、标签的使用2.1 开始标签和结束标签2.2 自闭合标签2.3 标签的嵌套2.4 标签的有效性三、属性四、缩进与格式4.1 一致的缩进4.2 元素单独占用一行4.3 嵌套元素的缩进4.4 避免冗长的行五、字符编码六、小结在开发 HTML…

项目一:使用 Spring + SpringMVC + Mybatis + lombok 实现网络五子棋

一&#xff1a;系统展示: 二&#xff1a;约定前后端接口 2.1 登陆 登陆请求&#xff1a; GET /login HTTP/1.1 Content-Type: application/x-www-form-urlencodedusernamezhangsan&password123登陆响应&#xff1a; 正常对象&#xff1a;正常对象会在数据库中存储&…

从 vue 源码看问题 — vue 初始化都做了什么事?

前言 最近想要对 Vue2 源码进行学习&#xff0c;主要目的就是为了后面在学习 Vue3 源码时&#xff0c;可以有一个更好的对比和理解&#xff0c;所以这个系列暂时不会涉及到 Vue3 的内容&#xff0c;但是 Vue3 的核心模块和 Vue2 是一致的&#xff0c;只是在实现上改变了方式、…

如何在BSV区块链上实现可验证AI

​​发表时间&#xff1a;2024年10月2日 nChain的顶尖专家们已经找到并成功测试了一种方法&#xff1a;通过区块链技术来验证AI&#xff08;人工智能&#xff09;系统的输出结果。这种方法可以确保AI模型既按照规范运行&#xff0c;避免严重错误&#xff0c;遵守诸如公平、透明…

MATLAB——矩阵操作

内容源于b站清风数学建模 数学建模清风老师《MATLAB教程新手入门篇》https://www.bilibili.com/video/BV1dN4y1Q7Kt/ 目录 1.MATLAB中的向量 1.1向量创建方法 1.2向量元素的引用 1.3向量元素修改和删除 2.MATLAB矩阵操作 2.1矩阵创建方法 2.2矩阵元素的引用 2.3矩阵…

SQL基础—2

1.左外连接查询&#xff08;left join on&#xff09; A - A∩B 左外连接查询两张表条件都满足的数据&#xff0c;以及左边表(A表)存在的数据(以左边表为主查询表)。 A - A∩B (A和A交B)。 示例&#xff1a;使用左外连接将dept表作为主查询表&#xff0c;查询员工编号、员工姓…

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

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

【优选算法】——二分查找!

目录 1、二分查找 2、在排序数组中查找元素的第一个和最后一个位置 3、搜索插入位置 4、x的平方根 5、山脉数组的封顶索引 6、寻找峰值 7、寻找旋转排序数组中的最小值 8、点名 9、完结散花 1、二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组…

Fooocus图像生成软件本地部署教程:在Windows上快速上手AI创作

文章目录 前言1. 本地部署Fooocus图像生成软件1.1 安装方式1.2 功能介绍 2. 公网远程访问Fooocus3. 固定Fooocus公网地址 前言 本篇文章将介绍如何在本地Windows11电脑部署开源AI生图软件Fooocus&#xff0c;并结合Cpolar内网穿透工具轻松实现公网环境远程访问与使用。 Foooc…

elasticSearch 7.12.1 Docker 安装ik分词

一、下载 https://github.com/infinilabs/analysis-ik/releases/tag/v7.12.1 将文件解压&#xff0c;复制到docker挂载的目录 docker ps#重启docker docker restart f7ec58e91f1f 测试 GET _analyze?pretty {"analyzer": "ik_max_word","text&qu…

智慧汇聚:十款企业培训工具打造学习型企业

在当今快速变化的商业环境中&#xff0c;企业要想保持竞争力&#xff0c;就必须不断适应新技术、新市场和新的工作方式。构建一个学习型企业&#xff0c;不仅能够促进员工的个人成长&#xff0c;还能增强团队的整体能力和企业的创新能力。为了实现这一目标&#xff0c;借助先进…