【测试开发学习历程】python类的继承

目录

1 继承的概念

2 继承的写法

3 子类继承父类的属性和方法

4 子类新增父类没有的属性和方法

5 子类重写父类的属性和方法

6 super超类的使用

7 多继承


1 继承的概念

继承是类与类之间的一种关系,子类继承父类。通过继承可以使得子类能够拥有父类的属性和方法,以达到复用的目的。

  • 子类:需要继承的类

  • 父类:被继承的类

父类与子类示意图:

理解:

  1. 动物类作为狗的父类,所以狗继承了动物类的属性和方法,比如动物具有吃、跑、睡等特征,狗也同样具备这些特征;

  2. 父类和子类的关系是相对的,子类又可以是它的子类的父类,比如:动物类是狗、猫、牛的父类,狗、猫、牛是子类;但狗又是牧羊犬、中华田园犬的父类,牧羊犬、中华田园犬是子类。

继承的特点:

  1. 父类拥有的属性和方法,则子类一定有(私有的属性和方法可以通过子类对象._父类__方法间接调用),子类的对象可以直接调用父类的属性和方法;

  2. 父类拥有的属性和方法,子类可以修改,这就是重写父类的方法;

  3. 父类没有的属性和方法,子类可以新增。

2 继承的写法

在声明一个类的时候,如果这个类继承了父类,在类名后加括号来指定父类的名称。

# 定义一个父类
class People:type="高等生物"def get_type(self):print("父类的self:", self)return self.type# 私有方法def __study(self):return "学习软件测试"#定义一个子类,继承父类People
class Students(People):def study(self):print("子类的self:", self)return "在蓉华学习IT技术"
​
# 创建子类对象,调用父类的属性和方法
s1=Students()
print(s1.type)
print(s1.get_type())
print(s1._People__study())
​
# 通过子类对象s1调用子类的study()方法,可以看出打印的self和父类方法中打印的self是同一个对象,也就是s1这个对象
print(s1.study())

3 子类继承父类的属性和方法

# 定义一个父类
class People:type="高等生物"
​def get_type(self):return self.type
#定义一个子类,集成父类People
class Students(People):pass
​
#创建Students类的对象
stu1=Students()
#子类对象可以调用父类的属性和方法,因为继承过来了
print(stu1.type)
print(stu1.get_type())

4 子类新增父类没有的属性和方法

# 定义一个父类
class People:type="高等生物"
​def get_type(self):return self.type
#定义一个子类,集成父类People
class Students(People):#子类的属性type2 ="小学生"   #子类的方法def get_type2(self):return self.type2
​
#创建Students类的对象
stu1=Students()
#子类对象可以调用父类的属性和方法,因为继承过来了
print(stu1.type)
print(stu1.get_type())

5 子类重写父类的属性和方法

重写父类中的方法的原因:父类中的方法不能满足子类的需要,但是子类又想保留这个方法名。

#把适用于自己的父类方法写成自己的方法
# 定义一个父类
class People:type="高等生物"
​def get_type(self):return self.type
#定义一个子类,继承父类People
class Students(People):type ="小学生"def get_type(self):return self.type
​
#创建Students类的对象
stu1=Students()
#子类对象可以调用父类的属性和方法,因为继承过来了
print(stu1.type)
print(stu1.get_type())

6 super超类的使用

在类的继承中,如果重新定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 super 超类来实现,比如:

class Animal(object):def __init__(self, name):self.name = name
​def greet(self):print('Hello, I am %s.' % self.name)
​
​
class Dog(Animal):def greet(self):# 在Python3中如下两种方式二选一,都可以实现调用父类的方法super(Dog, self).greet()# super().greet()print("汪汪汪...")
​
Dog("小灰").greet()
# 输出:
Hello, I am 小灰.
汪汪汪...

super超类的作用是调用父类的方法,当在子类中调用父类的同名的方法时,需要通过super超类来调用。不同名的方法可以直接通过self来调用。

python3.x中通过super超类调用父类方法有两种写法:

  1. super().父类的方法(参数)

  2. super(子类名称,self).父类的方法(参数)

super超类的一个最常见用法就是在子类中调用父类的构造方法,Python继承情况下写构造方法的3种典型场景:

  1. 如果子类没有显式声明__init__()方法,不管父类有没有显式地声明__init__()方法,都不需要在子类中手动地调用父类的__init__()方法,系统会实现自动调用;

  2. 如果子类显式声明了__init__()方法,但父类没有显式声明__init__()方法,同样不需要在子类中手动地调用父类的__init__()方法,系统会实现自动调用;

  3. 如果子类和父类都显式声明__init__()方法,则必须在子类的__init__()方法中用super手动地调用父类的__init__()方法(调用父类的__init__()方法时不需要传入self参数)。

举例:

#例子1:父类显式地声明了__init__方法,而子类没有显式地声明了__init__方法
#定义一个父类
class People:type="高等生物"#构造方法def __init__(self, name, age):# self表示对象本身# 定义属性self.name = nameself.age = agedef get_type(self):return self.type
#定义一个子类,集成父类People
class Students(People):pass
​
#创建Students类的对象,需要传入父类构造方法需要的参数,当子类没有显式地声明__init__方法的时候,在创建子类对象之前,系统会自动调用父类的__init__方法来完成父类对象的创建
stu1=Students("张三",30)
print(stu1.name)
print(stu1.age)
​
#例子2:父类没有显式地声明__init__方法,而子类显式地声明了__init__方法
# 定义一个父类
class People:type="高等生物"#构造方法# def __init__(self, name, age):#     # self表示对象本身#     # 定义属性#     self.name = name#     self.age = agedef get_type(self):return self.type
#定义一个子类,集成父类People
class Students(People):def __init__(self, sex, school):self.sex=sexself.school=school
​
#创建Students类的对象,因为父类没有显式地声明__init__方法,当子类显式地声明__init__方法的时候,在创建子类对象之前,系统会自动调用父类的默认的不带参的__init__方法来完成父类对象的创建
stu1=Students("男","成都职业技术学院")
print(stu1.sex)
print(stu1.school)
​
#例子3:父类和子类都显式地声明了__init__方法
# 定义一个父类
class People:type="高等生物"#构造方法def __init__(self, name, age):# self表示对象本身# 定义属性self.name = nameself.age = agedef get_type(self):return self.type
#定义一个子类,集成父类People
class Students(People):def __init__(self, sex, school, name, age):#当父类和子类中都显式地声明了__init__方法时,需要在子类中用super对象来调用父类的__init__         方法,以完成父类对象的创建,这样才能实现子类继承父类。此时子类的__init__方法的形参包括父类        __init__方法的形参super().__init__(name, age)self.sex=sexself.school=school#例子4:
#子类重写了父类的方法,还需要调用父类的方法
#定义一个父类
class People:type="高等生物"
​def get_type(self,):return self.type
#定义一个子类,集成父类People
class Students(People):type1 ="小学生"def get_type(self):return self.type1def super_get_type(self): # 重新父类的方法后用作调用父类的方法return super().get_type()
#创建Students类的对象
stu1=Students()
#子类重新父类的方法后再调用父类的方法
print(stu1.super_get_type())

7 多继承

多继承:子类可以拥有多个父类,并且具有所有父类的属性和方法。例如:孩子会继承自己父亲和母亲的特性。

多继承示意图:

语法:

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

举例:

class A:def __init__(self):print("初始化A类对象")
​
class B(A):def __init__(self):# super().__init__()super(B, self).__init__()print("初始化B类对象")
​
class C(A):def __init__(self):super(C, self).__init__()print("初始化C类对象")
​
class D(B, C):def __init__(self):super(D, self).__init__()print("初始化D类对象")
​
b = B()
# 输出:
初始化A类对象
初始化B类对象
​
d = D()
# 输出:
初始化A类对象
初始化C类对象
初始化B类对象
初始化D类对象

在创建D类的对象时,按正常的理解,程序调用顺序应该是:实例化D以后,通过super调用类B的__init__,然后B再通过super调用类A的__init__,因此程序输出结果应该是a b d,可实际上程序输出结果却是a c b d,这究其原因,就是因为Python中的MRO的问题了。

MRO:就是方法解析顺序(Method Resolution Order),可以通过类调用__mro__方法来查看MRO

print(D.__mro__)
# 输出:
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

从以上输出,可以看出,MRO的顺序是:D-->B-->C-->A-->object(object类是所有类的基类,Python解释器在解释执行代码的时候会自动继承object类),所以执行时输出的顺序就是:A C B D。

举例:思考如下代码的输出是多少?

class A:def __init__(self):self.n = 2
​def add(self, m):print("A 类中self为:", self)self.n += m
​
class B(A):def __init__(self):super().__init__()# super(B, self).__init__()self.n = 3
​def add(self, m):print("B 类中self为:", self)super().add(m)self.n += 3
​
class C(A):def __init__(self):super().__init__()# super(C, self).__init__()self.n = 4
​def add(self, m):print("C 类中self为:", self)super().add(m)self.n += 4
​
class D(B, C):def __init__(self):super().__init__()# super(D, self).__init__()self.n = 5
​def add(self, m):print("D 类中self为:", self)super().add(m)self.n += 5
​
d = D()
d.add(2)
print(d.n)

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

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

相关文章

scanf()返回转换成功的个数

一、概要 1、scanf()的读取与返回 scanf()&#xff0c;敲下回车进行一次读取&#xff0c;如果没有读到或没有读够&#xff0c;就继续等待输入 scanf()一次可以读取一个&#xff0c;也可以读取多个&#xff0c;多个之间用空格隔开 读取的数据按照%后面的字符格式进行转换&am…

【CSS面试题】Flex实现九宫格

考察知识&#xff1a; flex布局 水平垂直居中的实现 初始效果 代码关键&#xff1a;给父盒子添加以下属性 flex-wrap: wrap; /* 允许换行 */justify-content: space-around; /* 主轴对齐方式 */align-content: space-around; /* 多行在侧轴上的对齐方式 */<!DOCTYPE html&…

Java 自定義 List<T> 分頁工具

Java 自定義 List 分頁工具 PS: T可修改为对应的实体 rt com.google.common.collect.Lists;import java.util.Arrays; import java.util.Collections; import java.util.List;/*** ClassName: MyPageHelper* Descripution: List<T>分頁工具**/ public class MyPageHelp…

10BASE-T1S架构助力车载E/E领域,引领汽车产业迈向智能化新纪元!

汽车架构的发展 如今&#xff0c;汽车已不仅仅满足消费者的代步需求&#xff0c;而是向所谓的ACES&#xff08;Autonomous, Connected, Electrification, Shared Source&#xff09;方向发展&#xff0c;全自动驾驶和网联化将成为最终目标。由此带来的高算力和高数据吞吐量问题…

政安晨:【Keras机器学习实践要点】(二十八)—— 使用Reptile进行小样本学习

目录 介绍 定义超参数 准备数据 可视化数据集中的一些示例 建立模型 训练模型 可视化结果 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处…

数据库练习

insert into employee(empno,ename,job,mgr,hiredate,sal,comm,deptno) values (1001,甘宁,文员,1013,2000-12-17,8000.00,NULL,20), (1002,黛绮丝,销售员,1006,2001-02-20,16000.00,3000.00,30), (1003,殷天正,销售员,1006,2001-02-22,12500.00,5000.00,30), (1004,刘备,经理,…

kimichat使用技巧:用语音对话聊天

kimichat之前是只能用文字聊天的&#xff0c;不过最近推出了语音新功能&#xff0c;也可以用语音畅快的对话聊天了。 这个功能目前支持手机app版本&#xff0c;所以首先要在手机上下载安装kimi智能助手。已经安装的&#xff0c;要点击检查更新&#xff0c;更新到最新的版本。 …

Ubuntu 20.04 设置开启 root 远程登录连接

Ubuntu默认不设置 root 帐户和密码 Ubuntu默认不设置 root 帐户和密码 Ubuntu默认不设置 root 帐户和密码 如有需要&#xff0c;可在设置中开启允许 root 用户登录。具体操作步骤如下&#xff1a; 操作步骤 1、首先使用普通用户登录 2、设置root密码 macw:~$ sudo passwd …

Llama2模型本地部署(Mac M1 16G)

环境准备 环境&#xff1a;Mac M1 16G、Conda Conda创建环境配置 使用Anaconda-Navigator创建python 3.8环境 切换到新建的conda环境&#xff1a; conda activate llama38 llama.cpp 找一个目录&#xff0c;下载llama.cpp git clone https://github.com/ggerganov/llama.…

读所罗门的密码笔记18_大宪章

1. 大宪章 1.1. 1215年会议开启了一个艰难的谈判过程&#xff0c;充满了紧张和对权力与道德权威的争夺 1.1.1. 这部宪章会赋予各方一系列的权力&#xff0c;对国王的自由裁量权进行制衡 1.2. 《大宪章》还需要300多年的时间和多次迭代&#xff0c;才能成为财产权、公平税收、…

STM32 DCMI 的带宽与性能介绍

1. 引言 随着市场对更高图像质量的需求不断增加&#xff0c;成像技术持续发展&#xff0c;各种新兴技术&#xff08;例如3D、计算、运动和红外线&#xff09;的不断涌现。如今的成像应用对高质量、易用性、能耗效率、高集成度、快速上市和成本效益提出了全面要求。为了满足这些…

【算法一则】做算法学数据结构 - 简化路径 - 【栈】

目录 题目栈代码题解 题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 ‘/’ 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&#xff09;表…

Cesium 无人机航线规划

鉴于大疆司空平台和大疆无人机app高度绑定&#xff0c;导致很多东西没办法定制化。 从去年的时候就打算仿大疆开发一套完整的平台&#xff0c;包括无人机app以及仿司空2的管理平台&#xff0c;集航线规划、任务派发、实时图像、无人机管理等功能的平台。 当前阶段主要实现了&…

突破编程_前端_SVG(circle 圆形)

1 circle 元素的基本属性和用法 SVG 的 <circle> 元素用于在SVG文档中绘制圆形。它具有几个基本属性&#xff0c;允许定义圆形的大小、位置、填充颜色和边框样式。以下是 <circle> 元素的基本属性及其详细解释&#xff1a; 1.1 cx 和 cy 描述&#xff1a;这两个…

记录一次Java中使用P12证书访问https,nginx返回403的问题

目录 1、先使用浏览器导入证书访问&#xff0c;测试证书和密钥是否正确2、编写初始java代码3、结果响应 403 Forbidden4、解决方案 1、先使用浏览器导入证书访问&#xff0c;测试证书和密钥是否正确 成功返回&#xff0c;说明p12证书和密钥是没问题的。 2、编写初始java代码 …

Harmony鸿蒙南向外设驱动开发-Codec

功能简介 OpenHarmony Codec HDI&#xff08;Hardware Device Interface&#xff09;驱动框架基于OpenMax实现了视频硬件编解码驱动&#xff0c;提供Codec基础能力接口给上层媒体服务调用&#xff0c;包括获取组件编解码能力、创建组件、参数设置、数据的轮转和控制、以及销毁…

oracle创建整个数据库的只读账户

在源用户readonly 下创建只读用户 reader readonly 的表空间为AA 一、创建只读用户 create user reader identified by 密码 default tablespace AA; 二、授权 grant connect to reader ; 三、获取原账号readonly 的查询权限 select grant select on ||owner||.||object…

【面试题】redis在工作中的使用场景有哪些?

前言&#xff1a;在实际工作中&#xff0c;Redis作为一种高性能的内存数据库和缓存系统&#xff0c;可以应用于多种场景&#xff0c;同时在面试过程中也经常被问到类似的问题&#xff0c;我们经常会被问的一脸懵逼&#xff0c;那今天我们就来总结一下redis的一些使用场景。 数据…

实战解析:SpringBoot AOP与Redis结合实现延时双删功能

目录 一、业务场景 1、此时存在的问题 2、解决方案 3、为何要延时500毫秒&#xff1f; 4、为何要两次删除缓存&#xff1f; 二、代码实践 1、引入Redis和SpringBoot AOP依赖 2、编写自定义aop注解和切面 3、application.yml 4、user.sql脚本 5、UserController 6、U…

基于ssm微信小程序的医院挂号预约系统

采用技术 基于ssm微信小程序的医院挂号预约系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 用户管理 医院管理 医生管理 公告资讯管理 科室信息管…