Python基础之类的继承与派生

news2024/12/25 13:45:36

一、继承

新创建一个类,这个类可以继承一个或多个父类,新创建的类及哦啊做子类或派生类,被继承的类叫做父类或基类。

例:

class ParentClass_01:   # 定义父类
    pass

class ParentClass_02:   # 定义父类
    pass

class SonClass_01(ParentClass_01):    # 继承一个父类
    pass

class SonClass_02(ParentClass_01, ParentClass_02):    # 继承多个父类
    pass

通过类的内置属性__base__可以查看类继承的所有父类

print(ParentClass_01.__bases__)

# (<class 'object'>,)

print(SonClass_02.__bases__)

# (<class '__main__.ParentClass_01'>, <class '__main__.ParentClass_02'>)

二、继承与抽象

要找出类与类之间的继承关系,需要先抽象,再继承。抽象就是总结相似之处,总结对象之间的相处之处得到类,总结类与类之间的相似之处就可以得到父类。如图

基于抽象的结果,可以找到继承的关系

 由上图我们可以看出类与类之间的继承指的是:什么‘是’什么的关系(比如:人类、猪类、熊猫类都是动物类)。

子类可以继承父类的所有属性,因此继承用来解决类与类之间的代码重用性。

例如:定义一个Student类,一个Teacher类

class Student:
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
        
    def choose_course(self):
        print(f'{self.name} is choosing a course')
        
class Teacher:
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
        
    def teaching(self):
        print(f'{self.name} is teaching')

Student类与Teacher类之间存在重复的代码,老师与学生都是人类,所以可以定义一个People类,实现代码重用。

class People:
    school = '四川大学'
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

class Student(People):
    def choose_course(self):
        print(f'{self.name} is choosing a course')

class Teacher(People):
    def teaching(self):
        print(f'{self.name} is teaching')

 Student类与Teacher类中没有定义__init__方法,会从父类中找到__init__方法,从而进行正常实例化。

teacher = Teacher('zhang', 24, 'male')
print(teacher.school, teacher.name,teacher.age, teacher.sex)
# 四川大学 zhang 24 male

三、属性查找

有了继承关系,对象在查找属性时,先从对象自己的__dict__中查找,如果没有则去子类中找,然后再去父类中找。

class Foo:
    def f1(self):
        print('from Foo.f1')
    def f2(self):
        print('from Foo.f2')
        self.f1()

class Bar(Foo):
    def f1(self):
        print('from Bar.f1')

b = Bar()
b.f2()

# from Foo.f2
# from Bar.f1

查找顺序:b.f2()会现在子类Bar中找f2,没有找到,再去父类Foo中找到f2,先打印from Foo.f2,然后执行到self.f1(),即b.f1(),仍会按照:对象本身->类Bar->父类Foo的顺序依次找下去,在类Bar中找到f1,因而打印结果为from Bar.f1。

父类如果不想让子类覆盖自己的方法,可以采用双下划线的方式将方法设置为私有的:

class Foo:
    def __f1(self):    # 变形为:Foo__f1
        print('from Foo.f1')
    def f2(self):
        print('from Foo.f2')
        self.__f1()    # 变形为:self.Foo__f1,因此只会调用自己所在的类中的方法

class Bar(Foo):
    def f1(self):
        print('from Bar.f1')

b = Bar()
b.f2()

# from Foo.f2
# from Foo.f1

四、继承的先后顺序

一个子类可以同时继承多个父类,那么在查找元素属性的时候,是根据什么方式来进行的。

查找方式分为:深度优先和广度优先

新式类采用广度优先,经典类采用深度优先

先来了解一下什么是新式类,什么是经典类

在python2中才有经典类与新式类的说法,在python3中只有新式类。

新式类:由任意内置类型派生出来的类,如:str,list,dic,object

经典类:不是由任意内置类型派生出来的类

# 在python2中
class A(object):   # 新式类
    pass

class B:    # 经典类
    pass

class C:   # 经典类
    pass

class D(C):    # 经典类
    pass
# 在python3中
class A:     # 新式类,继承了object类
    pass
print(A.__bases__)     
# (<class 'object'>,)

例:

class P1:
    def foo(self):
        print('P1---foo')
    
class P2:
    def foo(self):
        print('P2---foo')
    def bar(self):
        print('P2---bar')
        
class C1(P1, P2):
    pass

class C2(P1, P2):
    def bar(self):
        print('C2---bar')
        
class D(C1, C2):
    pass

d = D()
d.foo()
d.bar()

继承关系:

在python2中,使用深度优先查找,查找顺序为:

D->C1->P1->P2->C2->P1->P2

输出结果为:

P1---foo
P2---bar

在python3中,使用广度优先查找,查找顺序为:

D->C1->C2->P1->P2

输出结果为:

P1---foo
C2---bar

五、派生与方法重用

子类可以派生出自己新的属性,在进行属性查找时,子类中的属性名会优先于父类被查找,例如每个老师还有职称这一属性,我们就需要在Teacher类中定义该类自己的__init__覆盖父类的

class People:
    school = '四川大学'
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

class Teacher(People):
    def __init__(self, name, age, sex, title):
        self.name = name
        self.age = age
        self.sex = sex
        self.title = title

    def teaching(self):
        print(f'{self.name} is teaching')
teacher = Teacher('lili',18,'female','特级讲师')
print(teacher.name, teacher.age, teacher.sex, teacher.title)
# lili 18 female 特级讲师

子类的__init__中有重复代码,可以使用下面的方式实现在子类派生出的方法中重用父类的功能。

1:“指名道姓”地调用某一个类的函数

class People:
    school = '四川大学'
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

class Teacher(People):
    def __init__(self, name, age, sex, title):
        People.__init__(self,name, age, sex)   # 调用的是函数,需要传入self
        self.title = title

    def teaching(self):
        print(f'{self.name} is teaching')

2:使用super()

调用super()会得到一个特殊的对象,该对象专门用来引用父类的属性。

class People:
    school = '四川大学'
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

class Teacher(People):
    def __init__(self, name, age, sex, title):
        super().__init__(name, age, sex)   # 调用的是绑定方法,自动传入self
        self.title = title

    def teaching(self):
        print(f'{self.name} is teaching')

使用这两种方法时,需要注意传参的差别。这两种方式的区别是:第一种是跟继承没有关系的,第二种的super()是依赖于继承的,并且即使没有直接继承关系,super()也会按照MRO继续往后找。

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

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

相关文章

RTKLIB学习总结(九)RTK算法详解

文章目录 一、RTK算法数据类型1、rtk_t&#xff1a;rtk控制结构体2、sol_t&#xff1a;结果结构体3、SOLQ_XXX&#xff1a;解的类型状态4、ambc_t&#xff1a;模糊度固定控制结构体5、ssat_t&#xff1a;卫星状态控制结构体6、prcopt_t&#xff1a;算法处理选项结构体7、obs_t&…

【ChatGPT工具篇-1】ChatGPT + MindShow 分分钟搞定PPT制作

AI 能生万物吗&#xff1f; &#xfeff;&#xfeff;&#xfeff; 制作一份“通用性”的PPT需要几步&#xff1f; 三步 借助ChatGPT和MindShow&#xff0c;分分钟完成操作&#xff0c;就能制作出来完胜大部分人的PPT文件&#xff1b; 解锁更多AIGC&#xff08;ChatGPT、AI绘…

C#,码海拾贝(42)——病态线性方程组的“简单迭代解法”之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 求解线性方程组的类 LEquations /// 原作 周长发 /// 改编 深度混淆 /// </summary> public static partial class LEquations { /// <summary> /…

chatgpt赋能python:Python如何定义π

Python如何定义π 介绍 Python是一种高级编程语言&#xff0c;它被广泛用于数据分析、机器学习、科学计算和Web开发等领域。在这些领域中&#xff0c;算数计算是非常重要的&#xff0c;而数学领域中重要的一个数字就是π。 π是圆的周长与直径的比例。它是一个无限不循环的小…

springboot+vue房屋租赁租房管理系统94sk3

本租房管理系统有管理员&#xff0c;租客&#xff0c;屋主三个角色。管理员功能有个人中心&#xff0c;租客管理&#xff0c;屋主管理&#xff0c;房源信息管理&#xff0c;订单信息管理&#xff0c;屋主申诉管理&#xff0c;通知公告管理&#xff0c;留言板管理&#xff0c;系…

chatgpt赋能python:Python多行注释

Python 多行注释 在 Python 中&#xff0c;我们经常需要写注释来解释代码或者用于调试。Python 的注释分为单行注释和多行注释&#xff0c;本文主要介绍 Python 中如何多行注释。 单行注释 在 Python 中&#xff0c;单行注释以符号 # 开头&#xff0c;可以写在代码的任何位置…

魔法打败魔法?OpenAI用GPT-4 来解释 GPT-2 的行为

大语言模型&#xff08;LLM&#xff09;像大脑一样&#xff0c;它们是由 “神经元” 组成的&#xff0c;它们观察文本中的一些特定模式&#xff0c;以影响整个模型接下来 “说” 什么。但由于 LLM 中的参数数量多到已经无法由人类解释的程度&#xff0c;因此&#xff0c;LLM 给…

MixQuery系列(一):多数据源混合查询引擎调研

背景 存储情况 当前的存储引擎可谓百花齐放,层出不穷。为什么会这样了?因为不存在One for all的存储,不同的存储总有不同的存储的优劣和适用场景。因此,在实际的业务场景中,不同特点的数据会存储到不同的存储引擎里。 业务挑战 然而异构的存储和数据源,却给分析查询带…

如何兼顾性能+实时性处理缓冲数据?

我们经常会遇到这样的数据处理应用场景&#xff1a;我们利用一个组件实时收集外部交付给它的数据&#xff0c;并由它转发给一个外部处理程序进行处理。考虑到性能&#xff0c;它会将数据存储在本地缓冲区&#xff0c;等累积到指定的数量后打包发送&#xff1b;考虑到实时性&…

Golang每日一练(leetDay0094) H 指数 I\II H Index

目录 274. H 指数 H Index &#x1f31f;&#x1f31f; 275. H 指数 II H Index ii &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 27…

sqlserver数据库学习感悟(1)----关于group by

以下含编写过程&#xff0c;如果嫌啰嗦&#xff0c;最后有总结哒&#xff01; 例题&#xff1a;有heat表和eatables两张表&#xff0c;分别为&#xff1a; eatables heat&#xff1a;protein&#xff08;蛋白质&#xff09;&#xff0c;fat&#xff08;脂肪&#xff09;&…

架构演变过程

单体架构 分布式架构&#xff1a;业务拆分 微服务 分布式架构的一种。独立开发和部署&#xff0c;一个业务多个服务支持 特点&#xff1a; 单一职责&#xff1a;拆分粒度更小&#xff0c;一个服务一个业务&#xff0c;避免重复开发&#xff08;面向对象角度来说符合最少知道原…

软考A计划-系统架构师-学习笔记-第五弹

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

Swift——如何将某一进制的数字按另一种进制输出(比如十进制输出打印成十六进制,八进制打印输出成二进制)

最近由于需要阅读比较老的文档&#xff0c;老文档里内存地址是用八进制而不是十六进制&#xff0c;所以需要写一个小工具&#xff0c;用来转换进制进制。虽然自带的计算器可以&#xff0c;但是数量一多比较麻烦。 一开始我想费劲吧啦写十二个转换函数&#xff0c;虽然有些函数可…

chatgpt赋能python:Python字符串:如何定义一个空字符串

Python字符串&#xff1a;如何定义一个空字符串 在Python中&#xff0c;字符串是一种常见的数据类型&#xff0c;通常用于存储文本信息。定义一个空字符串在Python中非常简单&#xff0c;本文将介绍如何定义一个空字符串以及在Python中使用字符串的一些常见操作。 定义一个空…

基于Java+SpringBoot+Vue前后端分离摄影分享网站平台系统

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

python课程设计:实现一个飞行训练成绩管理微信息系统,对飞行员的某门飞行课目成绩进行质量评定

一、编程题目 在日常飞行训练中,飞行训练成绩是 飞行员进行综合等级评定的重要依据。 假设飞行训练团在某次飞行训练结束后,要对飞行员的某门飞行课目成绩进行质量评定。 请编程实现一个飞行训练成绩管理系统。要求完成以下功能: 1录入成绩 2计算平均分 3计算最高分 4查…

零入门kubernetes网络实战-35->vxlan简介以及原理介绍(vxlan报文结构介绍)

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本篇文章开始介绍vxlan虚拟设备。 主要介绍vxlan的协议报文结构&#xff0c; 1、总结 主要涉及到以下方面&#xff1a; overlay跟vxlan的关系如何理解v…

Excel电子表格的PHP类库:PHP_XLSXWriter(大数据量报表、后台运行、浏览器下载)

Excel电子表格的PHP类库&#xff1a;PHP_XLSXWriter 一、PHP_XLSXWriter与PHPExcel的区别二、PHP_XLSXWriter的使用1.使用步骤2.后台下载3.浏览器下载4.封装函数 PHP_XLSXWriter 是一个用于生成 Microsoft Excel 2007 xlsx 文件的 PHP 库。XLSX 是一种用基于 XML 的开放式文件标…

chatgpt赋能python:Python多行缩进——提高代码可读性和效率的关键

Python多行缩进——提高代码可读性和效率的关键 众所周知&#xff0c;Python是一种缩进敏感的编程语言&#xff0c;它鼓励程序员使用缩进来表示代码块&#xff0c;而非传统的大括号或关键字。在Python中&#xff0c;缩进通过使用空格或制表符来实现&#xff0c;而且空格和制表…