Python 面向对象之继承

目录

概述

继承的作用

缺点

单继承实现

设置person类

创建子类学生类

实例化student类

创建worker子类

实例化worker类

子类独有属性

父类私有属性

子类构造函数修改

实例化子类

多继承实现

创建基类

创建父亲类

创建母亲类

创建子类

引入基类

创建子类并继承基类

调用继承类的方法

总结


 

概述

在我们创建类时,类名称旁边的小括号中,一般填写object(这并不是随便写的)。

Object类是所有类的父亲,还可称为基类或超类。

继承:有两个类,A类和B类,当我们说A类继承自B类时,

那么A类就拥有了B类中的所有属性和方法。

注意:继承者称为子类,被继承的类称为父类

继承的作用

  1. 简化了代码,减少冗余
  2. 提高代码的健壮性
  3. 提高了代码的安全性
  4. 是多态的前提

缺点

降低代码的灵活性。子类必须拥有父类的属性和方法,让子类自由的世界中多了些约束;

增强了耦合性。当父类的常量、变量和方法被修改时,需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来非常糟糕的结果——大段的代码需要重构。

降低代码的灵活性。耦合与内聚是描述类与类之间的关系。耦合性越低内聚性越高代码越好。

单继承实现

设置person类

创建一个基类person类,设置拥有名称、年龄属性,并且有吃和跑两种行为。

示例如下:

class Person(object):name = ''age = 0def __init__(self, name, age):# 赋值self.name = nameself.age = agedef eat(self, food):print('开始吃%s' % food)def run(self):print('开始跑步')

创建子类学生类

创建student类继承person类

需要引入person类,在构造函数中使用super继承父类的init。

示例如下:

from Person import Personclass Student(Person):def __init__(self, name, age):# 调用父类的init方法 需要传递相应参数super().__init__(name, age)

实例化student类

实例化学生类后,可以调用父类的方法。

示例如下:

from Student import Studentstu = Student('张三', 18)
stu.eat('果冻橙')
stu.run()# 执行结果
# 开始吃果冻橙
# 开始跑步

创建worker子类

创建worker类继承person类

还是需要引入person类,在构造函数中使用super继承父类的init。

示例如下:

from Person import Personclass Worker(Person):def __init__(self, name, age):super().__init__(name, age)

实例化worker类

实例化worker类后,也去调用父类的方法。

只要是继承Person类的都可以调用父类设置的方法。

示例如下:

from Student import Student
from Worker import Workerstu = Student('张三', 18)
stu.eat('果冻橙')
stu.run()work = Worker('李四', 20)
work.eat('面条')
work.run()

子类独有属性

子类也可以在继承原有父类的基础上拥有自己独有的属性。

比如在学生类中增加该学生的成绩分数。

示例如下:

from Person import Personclass Student(Person):def __init__(self, name, age, score):# 调用父类的init方法 需要传递相应参数super().__init__(name, age)# 赋值分数self.score = score

实例化时增加分数

示例如下:

from Student import Student
from Worker import Workerstu = Student('张三', 18, 100)
stu.eat('果冻橙')
stu.run()
print(stu.score)# 执行结果
# 开始吃果冻橙
# 开始跑步
# 100

父类私有属性

设置父类的私有属性,尝试子类是否能继承。

示例如下:

class Person(object):name = ''age = 0# 私有属性__money = 100def __init__(self, name, age, money):# 赋值self.name = nameself.age = ageself.__money = money
print(self.__money)def get_money(self):return self.__moneydef set_money(self, money):if money <= 0:money = 0self.__money = money

 

子类构造函数修改

在Student类构造函数中增加money属性传递。

示例如下:

from Person import Personclass Student(Person):def __init__(self, name, age, score, money):# 调用父类的init方法 需要传递相应参数super().__init__(name, age, money)# 赋值分数self.score = score

实例化子类

实例化学生类,并且调用set_money 和 get_money方法,执行后查看结果。

示例如下:

from Student import Studentstu = Student('张三', 18, 100, 1000)stu.set_money(200)
print(stu.get_money())# 执行结果
# 1000
# 200

通过查看结果可得出:子类没有继承父类的私有属性;

通过子类继承的公共方法访问私有属性,访问的是子类的私有属性,而不是父类的。

多继承实现

创建基类

创建父亲类

设置一个run和test类方法,在构造函数中赋值一个money属性。

示例如下:

class Father(object):def __init__(self, money):self.money = moneydef run(self):print('跑')def test(self):print('测试1')

 

创建母亲类

母亲类中有eat和test类方法,为了与父亲类做区别,在构造函数中赋值一个新的属性。

示例如下:

class Mother(object):def __init__(self, new_value):self.new_value = new_valuedef eat(self, food):print('吃%s' % food)def test(self):print('测试2')

创建子类

引入基类

将基类引入到当前子类的命名空间中。

示例如下:

from Father import Father
from Mother import Mother

创建子类并继承基类

创建子类并继承父类和母类,需要在构造函数中传递父类和母类构造函数需要的参数。

示例如下:

from Father import Father
from Mother import Motherclass Child(Father, Mother):def __init__(self, money, new_value):Father.__init__(self, money)Mother.__init__(self, new_value)

调用继承类的方法

多继承类实例化并调用父类方法。

示例如下:

from Child import Childif __name__ == '__main__':child = Child(100, 200)child.run()child.eat('香蕉')child.test()

执行结果:

跑
吃香蕉
测试1

通过执行结果可以发现继承的父类和母类中的方法都可以使用;

但是当父类和母类中方法名相同,默认调用的是在括号中排前面的父类中的方法。

总结

本篇为Python面向对象的继承概念和示例内容学习笔记。

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

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

相关文章

现代雷达车载应用——第3章 MIMO雷达技术 3.5节 汽车MIMO雷达的挑战

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 3.5 汽车MIMO雷达的挑战 在本节中&#xff0c;我们讨论了汽车MIMO雷达的设计挑战&#xff0c;包括多径反射存在时的测角、波形正交性和高效高分辨率角…

如何保证新加入的依赖版本与当前项目的其他相关依赖版本兼容?或者如何确保依赖版本升级后适合当前项目?或者如何保证新引入的依赖版本适合当前项目?

如何保证新加入的依赖版本与当前项目的其他相关依赖版本兼容&#xff1f;或者如何确保依赖版本升级后适合当前项目&#xff1f;或者如何保证新引入的依赖版本适合当前项目&#xff1f; 如题&#xff0c;可通过maven仓库找出各个版本之间的对应关系举例 如题&#xff0c;可通过m…

C/C++利用指针输出二维数组元素

方法一 用指向单个整型常量的指针p依次访问每个元素 int main() {int i, j;int a[2][3] { 1,2,3,4,5,6 };int* p &a[0][0];for (i 0; i< 2; i) {for (j 0; j < 3; j) {cout << left << setw(3) << *p;p;}cout << endl;}return 0; } 方法…

二阶构造设计模式

目录 构造函数回顾 深入思考 实验 构造函数的真相 半成品对象 引入二阶构造设计模式 设计理念 二阶构造设计模式图 二阶构造示例 完整demo 小结 构造函数回顾 类的构造函数用于对象的初始化。构造函数与类同名并且没有返回值。构造函数在对象定义时自动被调用 深入…

iphone 5s的充电时序原理图纸,iPAD充电讲解

上一篇写了iphone 5的时序。那是电池供电的开机时序。iphone 5s也是差不多的过程&#xff0c;不说了。现在看iphone5s手机充电时候的时序。iphone5s充电比iphone5充电简单了很多。 首先是usb接口接到手机上&#xff0c;usb线连接到J7接口上。J7接口不只是接usb&#xff0c;还能…

[bat批处理] 一键清理 Windows10 系统垃圾

文章目录 &#x1f680;使用批处理一键清理 Windows10 系统垃圾&#x1f528;编写批处理文件 &#x1f680;使用批处理文件&#x1f528;注意事项&#x1f680;总结 &#x1f680;使用批处理一键清理 Windows10 系统垃圾 Windows10 系统在使用过程中会产生大量的临时文件、日志…

kind类型是namespace和Resource Quota的yaml如何编写?有哪些关键字?

本次介绍两个关联度很高的类型&#xff0c;Namespace和Resource Quota。 Namespace基本说明 在 Kubernetes 中&#xff0c;Namespace 是对集群的一种虚拟化分区&#xff0c;用于将资源&#xff08;如 Pod、Service、ReplicaSet 等&#xff09;进行逻辑隔离和组织。它是一种对…

基于YOLOv8深度学习的苹果叶片病害智能诊断系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

工作需求清单

现在的项目我需要做的&#xff1a; 前端 内容描述参考备注1加载3D模型加载从Blender导出的glb 3D模型文件基本模型加载[完成] 2023-11-72灯效果已完成光锥&#xff0c;应添加LED面板灯-基本灯光功能3风扇效果添加风扇叶片旋转效果-基本灯光功能4交互 在3D场景中添加交互选项&…

Linux搭建 Kubernetes(K8S)集群详情教程

当搭建 Kubernetes 集群时&#xff0c;涉及的详细步骤可能较多&#xff0c;以下是详细的 Kubernetes 单节点集群搭建步骤&#xff1a; 步骤 1: 准备工作 确保满足以下基本要求&#xff1a; 一台运行 Ubuntu 18.04 或更高版本的机器。2 GB 或更多内存。2 个 CPU 核心或更多。…

引领未来:话务数据展示大屏助力企业决策

在当今信息爆炸的时代&#xff0c;企业需要一个直观、高效的数据展示平台来帮助他们快速获取、分析和决策。山海鲸可视化话务数据展示大屏&#xff0c;就是这样一款引领企业迈向高效决策新纪元的产品。 一、什么是山海鲸可视化话务数据展示大屏&#xff1f; 山海鲸可视化是一款…

【不用找素材】ECS 游戏Demo制作教程(1) 1.15

一、项目设置 版本&#xff1a;2022.2.0f1 &#xff08;版本太低的话会安装不了ECS插件&#xff09; 模板选择3D URP 进来后移除URP&#xff08;因为并不是真的需要&#xff0c;但也不是完全不需要&#xff09; Name: com.unity.entities.graphics Version: 1.0.0-exp.8 点击…

HTML概述、基本语法(表格整理、标签、基本结构)

一、HTML概述 HTML指的是超文本标记语言 超文本&#xff1a;是指页面内可以包含图片、链接、声音、视频等内容 标记&#xff1a;标签&#xff08;通过标记符号来告诉浏览器页面该如何显示&#xff09; 我们可以打开浏览器&#xff0c;右击页面&#xff0c;点击查看网页源代码&…

Java队列-Disruptor 的使用

一、什么是 Disruptor 从功能上来看&#xff0c;Disruptor 是实现了“队列”的功能&#xff0c;而且是一个有界队列。那么它的应用场景自然就是“生产者-消费者”模型的应用场合了。 可以拿 JDK 的 BlockingQueue 做一个简单对比&#xff0c;以便更好地认识 Disruptor 是什么…

第二百六十九回

文章目录 概念介绍设置方法示例代码内容总结 我们在上一章回中介绍了Card Widget相关的内容&#xff0c;本章回中将介绍国际化设置.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的国际化设置是指在App设置相关操作&#xff0c;这样可以让不同国家的…

书生·浦语大模型--第二节课作业

书生浦语大模型--第二节课作业 基础部分生成300字小故事hugging face 下载功能 进阶部分浦语灵笔的图文理解及创作部署Lagent 工具调用 Demo 创作部署 基础部分 生成300字小故事 hugging face 下载功能 hugging face被墙了&#xff0c;在本地电脑无论是不是科学上网&#xff…

STM32 定时器输入捕获2——捕获高电平时长

由上图我们可以知道&#xff0c;高电平时间t2-t1。在代码中&#xff0c;可以记录此时t1的时间然后再记录t2的时间&#xff0c;t2-t1&#xff0c;就是我们所想要的答案。 但是&#xff0c;还有更简单一点点的&#xff0c;当到达t1的时候&#xff0c;我们把定时器清零&#xff0c…

现代工程科技杂志现代工程科技杂志社现代工程科技编辑部2023年第21期目录

能源科技 配网故障停电原因及改进对策研究 上官安琪 110kV变电站电气自动化技术及应用策略 陈祥 变电运维误操作事故预控措施分析 高翔;韦婉 智能变电站变电运维安全与设备维护探究 温亮亮;覃万全 110kV变电站电气设计及其防雷保护案例研析 谢旭平 变电运维…

解决哈希冲突的几种方法

什么是hash冲突 哈希函数是一个映像&#xff0c;把任意长度的输入&#xff0c;通过Hash算法变换成固定长度的输出&#xff0c;这个输出就是Hash值&#xff1b; 当两个不同的输入&#xff0c;产生了同一个输出值即为哈希冲突 解决方式 开放定址法 开放寻址法的核心思想是&am…

Django登录注销视图

Django在身份验证框架中包含了一些你可以直接使用的表单和视图。在大多数情况下&#xff0c;可以使用默认的Django认证视图。 Django在django.contrib.auth.views提供了以下基于类的视图来处理身份验证&#xff1a; LoginView&#xff1a;处理登录表单并登录用户 LogoutView&a…