Python编程实验六:面向对象应用
目录
一、实验目的与要求
二、实验内容
三、主要程序清单和程序运行结果
第1题
第2题
四、实验结果分析与体会
一、实验目的与要求
(1)通过本次实验,学生应掌握类的定义与对象的创建、类的继承与方法的覆盖;
(2)理解类变量与实例变量的区别,能正确应用私有成员保护机制和运算符重载;
(3)综合应用所学知识实现对问题的编程求解;
(4)按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及及相关实验数据与运行结果)
二、实验内容
请使用Python语言在Jupyter Notebook环境下编程,完成下列题目的要求:
1、定义一个表示时间的类Time,要求它提供下面操作:
(1)Time(hours,minutes,seconds)创建一个时间对象
(2)t.hours()、t. minutes()和t. seconds()分别返回时间对象t的小时、分钟和秒钟值
(3)使用运算符==和<判断两个时间对象的相等和小于关系
(4)使用运算符+和-为Time对象定义加法和减法操作,例如t1+t1表示基于当前时间t1向后延长一段t2时间,而t1-t2则表示基于当前时间t1向前提前一段t2时间。
提示:(3)和(4)要应用运算符重载
2、假设学校成员类(SchoolMember)具有成员的姓名(name)、年龄(age)、性别(sex)属性。教师类(Teacher)继承了学校成员类,该类还记录了教师的职称(title)、工资(salary)、奖金(prize)等信息。学生类(Teacher)也继承了学校成员类,该类还记录了学生所属系部(dept)、成绩(score)等信息。请定义以上3个类,要求同时满足如下功能:
(1)创建教师和学生对象时需要调用父类方法进行必要的初始化
(2)能反映学校成员总人数的增减变化,即每创建一个对象时,则总人数加1;而对象注销时,总人数减1
(3)能够计算每位教师的总收入(工资+奖金),虽然不允许直接访问总收入,但可以通过提供相应的方法返回总收入值
(4)能使用print()函数输出每个对象的相关信息
三、主要程序清单和程序运行结果
第1题
1、定义一个表示时间的类Time,要求它提供下面操作:
(1)Time(hours,minutes,seconds)创建一个时间对象
(2)t.hours()、t. minutes()和t. seconds()分别返回时间对象t的小时、分钟和秒钟值
(3)使用运算符==和<判断两个时间对象的相等和小于关系
(4)使用运算符+和-为Time对象定义加法和减法操作,例如t1+t1表示基于当前时间t1向后延长一段t2时间,而t1-t2则表示基于当前时间t1向前提前一段t2时间。提示:(3)和(4)要应用运算符重载
class Time:def __init__(self, hours, minutes, seconds):self._hours = hoursself._minutes = minutesself._seconds = secondsdef hours(self):return self._hoursdef minutes(self):return self._minutesdef seconds(self):return self._secondsdef __eq__(self, other):if isinstance(other, Time):return (self._hours == other.hours() andself._minutes == other.minutes() andself._seconds == other.seconds())return Falsedef __lt__(self, other):if isinstance(other, Time):if self._hours < other.hours():return Trueelif self._hours == other.hours():if self._minutes < other.minutes():return Trueelif self._minutes == other.minutes():if self._seconds < other.seconds():return Truereturn Falsedef __add__(self, other):if isinstance(other, Time):total_seconds = (self._hours * 3600 + self._minutes * 60 + self._seconds +other.hours() * 3600 + other.minutes() * 60 + other.seconds())hours = total_seconds // 3600minutes = (total_seconds % 3600) // 60seconds = (total_seconds % 3600) % 60return Time(hours, minutes, seconds)def __sub__(self, other):if isinstance(other, Time):total_seconds = (self._hours * 3600 + self._minutes * 60 + self._seconds -other.hours() * 3600 - other.minutes() * 60 - other.seconds())hours = total_seconds // 3600minutes = (total_seconds % 3600) // 60seconds = (total_seconds % 3600) % 60return Time(hours, minutes, seconds)h1 = int(input("请输入第一个时间的小时数:"))
m1 = int(input("请输入第一个时间的分钟数:"))
s1 = int(input("请输入第一个时间的秒钟数:"))
t1 = Time(h1, m1, s1)h2 = int(input("请输入第二个时间的小时数:"))
m2 = int(input("请输入第二个时间的分钟数:"))
s2 = int(input("请输入第二个时间的秒钟数:"))
t2 = Time(h2, m2, s2)if t1 == t2:print("t1 等于 t2")
else:print("t1 不等于 t2")
if t1 < t2:print("t1 小于 t2")
else:print("t2 小于 t1")t3 = t1 + t2
print("两个时间相加的结果为:{}小时{}分钟{}秒钟".format(t3.hours(), t3.minutes(), t3.seconds()))
t4 = t1 - t2
print("两个时间相减的结果为:{}小时{}分钟{}秒钟".format(t4.hours(), t4.minutes(), t4.seconds()))
以上代码定义了一个 Time 类,用于表示时间。该类包含以下方法和功能:
- __init__(self, hours, minutes, seconds): 初始化方法,接受小时、分钟和秒钟作为参数,并将它们存储在对象的实例变量中。
- hours(self), minutes(self), seconds(self): 这些方法用于获取对象实例中存储的小时、分钟和秒钟值。
- __eq__(self, other): 重载了相等运算符 ==,用于比较两个 Time 对象是否相等。
- __lt__(self, other): 重载了小于运算符 <,用于比较两个 Time 对象的大小关系。
- __add__(self, other): 重载了加法运算符 +,实现了两个 Time 对象的相加操作。
- __sub__(self, other): 重载了减法运算符 -,实现了两个 Time 对象的相减操作。
在主程序中,用户可以输入两个时间对象 t1 和 t2,然后进行以下操作:
- 检查 t1 是否等于 t2,并输出相应信息。
- 检查 t1 是否小于 t2,并输出相应信息。
- 将 t1 和 t2 相加,将结果存储在 t3 中,并输出相加结果。
- 将 t1 和 t2 相减,将结果存储在 t4 中,并输出相减结果。
这样,用户可以使用 Time 类来进行时间对象的比较、相加和相减操作。整体而言,这个代码实现了一个简单的时间处理功能。
运行结果:
第2题
2、假设学校成员类(SchoolMember)具有成员的姓名(name)、年龄(age)、性别(sex)属性。教师类(Teacher)继承了学校成员类,该类还记录了教师的职称(title)、工资(salary)、奖金(prize)等信息。学生类(Teacher)也继承了学校成员类,该类还记录了学生所属系部(dept)、成绩(score)等信息。请定义以上3个类,要求同时满足如下功能:
(1)创建教师和学生对象时需要调用父类方法进行必要的初始化
(2)能反映学校成员总人数的增减变化,即每创建一个对象时,则总人数加1;而对象注销时,总人数减1
(3)能够计算每位教师的总收入(工资+奖金),虽然不允许直接访问总收入,但可以通过提供相应的方法返回总收入值
(4)能使用print()函数输出每个对象的相关信息
class SchoolMember:total_members = 0def __init__(self, name, age, sex):self.name = nameself.age = ageself.sex = sexSchoolMember.total_members += 1def __del__(self):SchoolMember.total_members -= 1def get_info(self):return f"Name: {self.name}, Age: {self.age}, Sex: {self.sex}"class Teacher(SchoolMember):def __init__(self, name, age, sex, title, salary, prize):super().__init__(name, age, sex)self.title = titleself.salary = salaryself.prize = prizedef get_total_income(self):return self.salary + self.prizedef get_info(self):return f"{super().get_info()}, Title: {self.title}, Salary: {self.salary}, Prize: {self.prize}"class Student(SchoolMember):def __init__(self, name, age, sex, dept, score):super().__init__(name, age, sex)self.dept = deptself.score = scoredef get_info(self):return f"{super().get_info()}, Department: {self.dept}, Score: {self.score}"# 添加成员信息
def add_member():member_type = input("请输入成员类别(teacher or student): ")if member_type == "teacher":teacher_input = input("请输入教师信息(name, age, sex, title, salary, prize): ")teacher_info = teacher_input.split(",")teacher = Teacher(*teacher_info)members.append(teacher)print(f"增加老师: {teacher.get_info()}")elif member_type == "student":student_input = input("请输入学生信息(name, age, sex, department, score): ")student_info = student_input.split(",")student = Student(*student_info)members.append(student)print(f"增加学生: {student.get_info()}")else:print("无效成员类别")# 注销成员信息
def remove_member():name = input("请输入成员姓名: ")for member in members:if member.name == name:members.remove(member)del memberprint(f"{name}注销成功")returnprint(f"{name}未找到")members = []
while True:choice = input("请输入操作:(add, remove, info, quit): ")if choice == "add":add_member()elif choice == "remove":remove_member()elif choice == "info":for member in members:print(member.get_info())print(f"总成员数: {SchoolMember.total_members}")elif choice == "quit":breakelse:print("无效操作")print("程序结束")
print("所有成员信息:")
for member in members:print(member.get_info())
这段代码实现了一个简单的学校成员管理系统,包括 SchoolMember 类和其子类 Teacher 和 Student。
(1)类的定义:
- SchoolMember 类:表示学校成员,包含基本信息(姓名、年龄、性别)和一个类变量 total_members 记录总成员数。__init__ 方法用于初始化成员信息,__del__ 方法用于注销成员时减少总成员数,get_info 方法返回成员信息。
- Teacher 类:继承自 SchoolMember 类,增加了教师特有信息(职称、工资、奖金),并实现了计算总收入和重写 get_info 方法。
- Student 类:也继承自 SchoolMember 类,增加了学生特有信息(系别、成绩),并重写了 get_info 方法。
(2)添加成员信息函数 add_member():根据用户输入的成员类别(教师或学生),接收相应的信息并创建对应的对象,然后将对象添加到成员列表中,并输出添加成功的信息。
(3)注销成员信息函数 remove_member():根据用户输入的成员姓名,在成员列表中查找并删除相应的成员,然后输出注销成功或未找到的信息。
(4)主程序部分:通过不断循环接受用户输入,实现了添加成员、注销成员、显示所有成员信息和退出程序的功能。根据用户输入执行相应操作,并输出结果。
(5)最后输出所有成员信息,并结束程序运行。
整体而言,这个程序提供了一个简单的学校成员管理系统,能够方便地添加、查看和删除教师和学生的信息。
运行结果:
四、实验结果分析与体会
通过本次实验,掌握了类的定义与对象的创建、类的继承与方法的覆盖;理解类变量与实例变量的区别,能正确应用私有成员保护机制和运算符重载。理解类和对象,在Python面向对象编程中,类是对象的抽象,对象是类的实例。类定义了一组属性和方法,而对象则是具有这些属性和方法的实体。理解这一点对于理解面向对象编程至关重要。
封装是面向对象编程的基础。通过封装,我们可以把数据和操作数据的函数绑定到一起,形成一个整体,也就是对象。这样可以保护内部数据的安全,也使得代码更加清晰和易于维护。继承是面向对象编程中的一个重要特性。通过继承,子类可以继承父类的所有属性和方法,同时还可以添加自己特有的属性和方法。这样可以有效地提高代码的复用性。多态是指同一个方法在不同的对象上可能会产生不同的行为。Python是一种动态类型语言,所以它的多态性主要体现在运行时。理解多态可以使我们的代码更加灵活和通用。在面向对象编程中,我们需要处理各种可能出现的错误和异常。Python提供了一套完善的异常处理机制,可以帮助我们更好地处理这些问题。Python的装饰器是一种非常强大的工具,它可以用来修改或增强函数或类的功能。在面向对象编程中,装饰器可以帮助我们更好地管理和维护代码。
通过这次实验,我对Python面向对象编程有了更深入的理解,也提高了我的编程技能。我认为,面向对象编程不仅是一种编程范式,更是一种思维方式,它可以帮助我们更好地分析问题,设计解决方案。
相关文章:

Python编程实验六:面向对象应用
目录 一、实验目的与要求 二、实验内容 三、主要程序清单和程序运行结果 第1题 第2题 四、实验结果分析与体会 一、实验目的与要求 (1)通过本次实验,学生应掌握类的定义与对象的创建、类的继承与方法的覆盖; (2…...

Vue3中的ref和reactive
今天在写前端, 用的是Vue3, 其实之前也有写过一些前端, 但是涉及不深, 差不多是基础的水平, 然后现在想跟进下Vue3, 就有点吃力得紧, 就单单一个变量的引用, 就折腾得不轻࿰…...

第二十节 Java 正则表达式
正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。 Java正则表达式和Perl的是最为相似的。 java.util.regex包主要包括以下三个类: Pattern类:…...

ubuntu下vscode+STM32CubeMX+openocd+stlinkv2搭建STM32开发调试下载环境
1、换源 清华源 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restr…...

【嵌入式高级C语言】9:万能型链表懒人手册
文章目录 序言单向不循环链表拼图框架搭建 - Necessary功能拼图块1 创建链表头信息结构体 - Necessary2 链表头部插入 - Optional3 链表的遍历 - Optional4 链表的销毁 - Necessary5 链表头信息结构体销毁 - Necessary6 获取链表中节点的个数 - Optional7 链表尾部插入 - Optio…...

如何快速分析OB集群日志,敏捷诊断工具obdiag分析能力实践——《OceanBase诊断系列》之四
1. 前言 obdiag是OceanBase的敏捷诊断工具。1.2版本中,obdiag支持快速收集诊断信息,但仅有收集能力是不够的,还需要有分析能力。因此在obdiag的1.3.0版本中,我们加入了OB集群的日志分析功能。用户可以一键进行集群的OB日志的分析…...

7.1.3 Selenium的用法2
目录 1. 切换 Frame 2. 前进后退 3. 对 Cookies 操作 4. 选项卡管理(了解) 5. 异常处理 6. 反屏蔽 7. 无头模式 1. 切换 Frame 我们知道网页中有一种节点叫作 iframe,也就是子 Frame,相当于页面的子页面,它的结构和外部网页的结构完全…...

微信小程序(五十四)腾讯位置服务示范(2024/3/8更新)
教程如下: 上一篇 1.先在官网注册一下账号(该绑定的都绑定一下) 腾讯位置服务官网 2.进入控制台 3.创建应用 3. 额度分配 4.下载微信小程序SDK 微信小程序SDK下载渠道 5.解压将俩js文件放在项目合适的地方 6.加入安全域名or设置不验证合…...

Selenium库快速查找网页元素及执行浏览器模拟操作
Selenium 是一个自动化测试工具,主要用于模拟用户在网页上的行为,进行自动化测试。它支持多种浏览器,并且可以在多种操作系统上运行。以下是 Selenium 库的一些主要特点和用途: 网页自动化测试: Selenium 可以模拟用户…...

2024年(第十届)全国大学生统计建模大赛选题参考(一)
本届大赛主题为“大数据与人工智能时代的统计研究”,参赛队围绕主题自拟题目撰写论文。 1. 大数据分析与处理 研究思路 数据收集:首先确定数据来源,例如社交媒体、企业数据库或公开数据集,并使用爬虫技术或API收集数据。数据预…...

EI级 | Matlab实现GCN基于图卷积神经网络的数据多特征分类预测
EI级 | Matlab实现GCN基于图卷积神经网络的数据多特征分类预测 目录 EI级 | Matlab实现GCN基于图卷积神经网络的数据多特征分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.GCN基于图卷积神经网络的数据分类预测 Matlab2023 2.多输入单输出的分类预测…...

贪心算法介绍
贪心算法是一种在求解问题时总是做出在当前看来是最好的选择的算法。它不从整体最优上加以考虑,所做出的选择只是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性…...

前端常用数据结构
前端常用数据结构 前端常用数据结构数据结构数组栈队列链表单向链表双向链表树前端常用数据结构 什么是数据结构常用的数据结构 JavaScript 如何实现这些数据结构实际场景数据结构 所谓数据结构,是在计算机中组织、管理和存储数据的一种方式。 🙋:你知道哪些数据结构? …...

java设计模式之——单例模式
一:什么是单例模式? 构造函数private之后,还需要提供一个方法,要保证只能初始化一个单例对象,并且需要考虑线程安全的问题。 二:单例模式多种写法? 具体到写法上,主要有5种&#…...

深入理解计算机系统学习笔记
1.1异常处理 处理器中很多事情都会导致异常控制流,此时,程序执行的正常流程被破坏掉。异常可以由程序执行从内部产生,也可以由某个外部信号从外部产 生。 我们的指令集体系结构包括三种不同的内部产生的异常: l)halt指令&#…...

Linux-进程信号
目录 概念信号产生信号注册信号注销信号处理实例 信号的基本应用 概念 进程信号: 概念:信号就是软件中断。信号就是用于向进程通知某个事件的产生,打断进程当前操作,去处理这个事件。 linux中信号的种类:使用kill -l命…...

Linux服务器安装jdk
背景: 安装JDK是我们java程序在服务器运行的必要条件,下面描述几个简单的命令就可再服务器上成功安装jdk 命令总览: yum update -y yum list | grep jdk yum -y install java-1.8.0-openjdk java -version 1.查看可安装版本 yum list | grep jdk 2.如果查不到可先进行 yum upd…...

基于 HBase Phoenix 构建实时数仓(2)—— HBase 完全分布式安装
目录 一、开启 HDFS 机柜感知 1. 增加 core-site.xml 配置项 2. 创建机柜感知脚本 3. 创建机柜配置信息文件 4. 分发相关文件到其它节点 5. 重启 HDFS 使机柜感知生效 二、主机规划 三、安装配置 HBase 完全分布式集群 1. 在所有节点上配置环境变量 2. 解压、配置环境…...

equals()与==的区别
在Java中 可以对基本类型进行比较,比较的是值是否相等 也可以对引用类型(对象)进行比较,比较的是引用变量所指向的空间地址 public static void main(String[] args) {int a 10;int b 10;System.out.println(ab);//true// 基本类型比较,比较值是否相等String s1 new Stri…...

什么是数据采集与监视控制系统(SCADA)?
SCADA数据采集是一种用于监控和控制工业过程的系统。它可以实时从现场设备获得数据并将其传输到中央计算机,以便进行监控和控制。SCADA数据采集系统通常使用传感器、仪表和控制器收集各种类型的数据,例如温度、压力、流量等,然后将这些数据汇…...

基于SpringBoot+Vue+ElementUI+Mybatis前后端分离管理系统超详细教程(五)——多条件搜索并分页展示
前后端数据交互 书接上文,我们上节课通过前后端数据交互实现了分页查询和单条件搜索分页查询的功能,最后留了个小尾巴,就是把其他两个搜索条件(email,address)也加进来,实现多条件搜索并分页展示。这节课我…...

鸿蒙实战开发Camera组件:【相机】
相机组件支持相机业务的开发,开发者可以通过已开放的接口实现相机硬件的访问、操作和新功能开发,最常见的操作如:预览、拍照和录像等。 基本概念 拍照 此功能用于拍摄采集照片。 预览 此功能用于在开启相机后,在缓冲区内重复采集…...

政安晨:【深度学习处理实践】(三)—— 处理时间序列的数据准备
在深度学习中,对时间序列的处理主要涉及到以下几个方面: 序列建模:深度学习可以用于对时间序列进行建模。常用的模型包括循环神经网络(Recurrent Neural Networks, RNN)和长短期记忆网络(Long Short-Term M…...

PCL不同格式点云读取速度(Binary和ASCII )
首先说明一点:Binary(二进制)格式点云文件进行读取时要比Ascll码格式点云读取时要快的多,尤其是对于大型的点云文件,如几百万、甚至几千万个点云的情况下。 今天遇到了一种情况,在写项目的时候进行点云读取,读取的时候…...

Neo4J图数据库入门示例
前言 - Neo4j和MySQL的区别 Neo4j 和 MySQL 是两种不同类型的数据库,它们在数据模型、用途、性能和查询语言等方面有着显著的区别。以下是它们的主要区别: 数据模型: Neo4j 是一种图数据库,它使用图数据模型来存储和查询数据。在…...

牛客每日一题之 二维前缀和
题目介绍: 题目链接:【模板】二维前缀和_牛客题霸_牛客网 先举两个简单的例子,来帮大家理解题目,注意理解二维前缀和要先要一维前缀和的基础,不了解的可以看我上一篇博客。 若x11,y11, x23, y2 3,这是要…...

动态规划 Leetcode 70 爬楼梯
爬楼梯 Leetcode 70 学习记录自代码随想录 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到…...

(未解决)macOS matplotlib 中文是方框
reference: Mac OS系统下实现python matplotlib包绘图显示中文(亲测有效)_mac plt 中文值-CSDN博客 module ‘matplotlib.font_manager‘ has no attribute ‘_rebuild‘解决方法_font_manager未解析-CSDN博客 # 问题描述(笑死 显而易见 # solve 找到…...

深入探讨C#中的递归算法
一、什么是递归算法? 递归是指一个函数或方法在执行过程中调用自身的情况。递归算法是编程中常见的一种解决问题的方法。它将一个问题分解成一个或多个与原问题相似但规模更小的子问题,然后通过解决这些子问题来解决原问题。递归算法通常用于解决重复性的…...

三款顶级开源RAG (检索增强生成)工具:Verba、Unstructured 和 Neum
三款顶级开源RAG (检索增强生成)工具:Verba、Unstructured 和 Neum 概述 随着企业对话式数据处理需求的提升,面临的挑战是数据隐私性和缺乏企业级解决方案。虽然类似LangChain能在短时间内构建RAG应用,但忽视了文档解析、多来源数据ETL、批量…...