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面向对象编程有了更深入的理解,也提高了我的编程技能。我认为,面向对象编程不仅是一种编程范式,更是一种思维方式,它可以帮助我们更好地分析问题,设计解决方案。

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

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

相关文章

守护Web安全:了解Web攻击与防护策略

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

MKS真空规740B-742B-840B-852B-R700说明详细内容查看目录和图片目录

MKS真空规740B-742B-840B-852B-R700说明详细内容查看目录和图片目录

HBase安装,配置,启动,检查

目录: 一、HBase安装&#xff0c;配置 1、下载HBase安装包 2、解压&#xff0c;配置环境变量并激活 3、hbase 配置 4、将hadoop和zookeeper的配置文件创建软连接放在hbase配置目录 5、配置 regionserver 二、HBase启动与关闭&#xff0c;安装检验 1、启动关闭hbase的命令 2、 检…

基于PHP的音乐网站后台管理系统设计与实现

目 录 摘 要 I Abstract II 引 言 3 1 相关技术 5 1.1 PHP技术 5 1.2 MySQL技术 5 1.3ThinkPHP框架 5 1.4 Apache技术 6 1.5 本章小结 6 2系统分析 7 2.1 功能需求 7 2.2 用例分析 7 2.3系统可行性分析 9 2.4 本章小结 10 3 系统设计 11 3.1 总体设计 11 3.2 数据库设计 12 3.…

IPSEC VPPN实验

实验背景&#xff1a;FW1和FW2是双机热备的状态。 实验要求&#xff1a;在FW和FW3之间建立一条IPSEC通道&#xff0c;保证10.0.2.0/24网段可以正常访问到192.168.1.0/24 IPSEC VPPN实验配置&#xff08;由于是双机热备状态&#xff0c;所以FW1和FW2只需要配置FW1主设备即可&…

YOLOX论文解读

paper&#xff1a;YOLOX: Exceeding YOLO Series in 2021 official implementation&#xff1a;https://github.com/Megvii-BaseDetection/YOLOX 本文的创新点 本文在YOLOv3的基础上进行了一些改进&#xff1a;包括将检测头进行解耦的decoupled head、从anchor-based转为anc…

分布式定时任务调度xxl-job

1. xxl-job基本介绍 1.1 Quartz的体系结构 Quartz中最重要的三个对象:Job&#xff08;作业&#xff09;、Trigger&#xff08;触发器&#xff09;、Scheduler&#xff08;调度器&#xff09;。 xxl-job的调度原理:调度线程在一个while循环中不断地获取一定数量的即将触发的Tr…

Haproxy 负载均衡集群

一. Haproxy 1. Haproxy 介绍 HAProxy 是法国开发者威利塔罗 (Willy Tarreau) 在2000年使用C语言开发的一个开源软件&#xff0c;是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器&#xff0c;支持基于cookie的持久性&#xff0c;自动故障切换&#xff0c;支持正则…

RocketMQ快速入门_2. rocketmq 的应用场景、与其他mq的差异

0. 引言 之前我们讲解过rabbitMQ&#xff0c;本期我们将进入吞吐量更加强大的rocketMQ的学习。 1. 基础概念 如果你是刚接触MQ的同学&#xff0c;还不清楚消息队列的基础概念的&#xff0c;可以参考我之前这篇文章&#xff1a; https://wu55555.blog.csdn.net/article/deta…

Java 学习和实践笔记(31):封装(encapsulation)

面向对象的三大特点&#xff1a;继承、封装、多态。前面学了继承&#xff0c;现在讲封装。 封装encapsulation一词来自于capsule&#xff0c;胶囊&#xff0c;小密器&#xff0c;密闭的空间。 封装的理念&#xff1a;高内聚&#xff0c;低耦合。 高内聚就是类的内部数据操作…

TCP包头、TCP为什么安全可靠、UDP和TCP的区别、http协议

我要成为嵌入式高手之3月8日Linux高编第十八天&#xff01;&#xff01; __________________________________________________ 学习笔记 TPC包头 1、序号 发送端发送数据包的编号 2、确认号 已经确认接收到的数据的编号&#xff0c;只有当ACK为1时&#xff0c;该位才有用 …

单例模式及线程安全的实践

&#x1f31f; 欢迎来到 我的博客&#xff01; &#x1f308; &#x1f4a1; 探索未知, 分享知识 !&#x1f4ab; 本文目录 引言基本的单例模式长啥样&#xff1f;怎样才能线程安全&#xff1f;**懒汉模式** ( 双 重 检 查 ) &#x1f389;总结&#x1f389; 引言 单例模式是个…

运维知识点-Tomcat

Tomcat tomcat日志告警 tomcat文件包含读取漏洞Tomcat ### 远程代码执行&#xff08;7.0.0-7.0.81&#xff09; 开启PUT&#xff0c;访问127.0.0.1&#xff1a;8080改PUT&#xff0c;创建x.jsp&#xff0c;写入shellwar后文件部署&#xff0c;登入特定后台&#xff0c;上传包含…

寻找两个正序数组的中位数[困难]

优质博文IT-BLOG-CN 一、题目 给定两个大小分别为m和n的正序&#xff08;从小到大&#xff09;数组nums1和nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为O(log (mn)) 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,3], nums2 [2] 输出&…

基于vue的联通积分商城数据可视化APP设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 前端技术介绍 3 1.1 前端开发语言 3 1.1.1 HTML5 3 1.1.2 CSS3 3 1.1.3 JavaScript 3 1.2 MVVM开发模式 4 1.3 Vue框架 4 1.4 Axios技术 5 1.5 ECharts 5 1.6 数据库技术 5 1.7 本章小结 6 2 前端开发的分析 7 2.1 功能性需求分析 7 2.2 …

【项目】仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器

本篇博客记录从0到1实现一个仿mudo库的One Thread One Loop式主从Reactor模型的高并发服务器组件。 在此之前我们要明确的是&#xff0c;该项目仅作为一个高并发服务器组件&#xff0c;因此该项目并不包含实际的业务需求处理内容。 前置知识背景 一、HTTP服务器 概念&#xf…

【编程实践】matlab中的转义字符

简记 这个报错是因为在sprintf函数中使用了无效的转义字符\U。在MATLAB中&#xff0c;转义字符\U是无效的&#xff0c;因此会导致警告。 检查sprintf函数中的格式化字符串是否包含了无效的转义字符。确保只使用MATLAB支持的转义字符。 如果想要输出一个反斜杠字符\&#xff0c…

【常见集合】Java 常见集合重点解析

Java 常见集合重点解析 1. 什么是算法时间复杂度&#xff1f; 时间复杂度表示了算法的 执行时间 和 数据规模 之间的增长关系&#xff1b; 什么是算法的空间复杂度&#xff1f; 表示了算法占用的额外 存储空间 与 数据规模 之间的增长关系&#xff1b; 常见的复杂度&#x…

git - 笔记

为什么要学习Git 为什么要学习Git软件 为什么学习 因为在主流开发中&#xff0c;基于互联网软件开发的项目都会使用Git软件来进行项目开发过程中的资源管理 比如人力资源 代码资源 比如前端资源 .html .java等代码资源 文档资源 像项目开发中涉及到的需求文档等 这种项目中管理…

Langchain-Chatchat本地搭建ChatGLM3模型和提取PDF内容

文章目录 1、软件要求2、安装CUDA2.1、安装gcc2.2、安装CUDA 3、安装Anaconda33.1、下载Anaconda33.2、创建python虚拟环境 4、部署系统4.1、下载源码4.2、安装依赖4.3、下载模型4.4、初始化配置和知识库4.4.1、初始化配置4.4.2、初始化知识库 4.5、运行4.6、运行4.6.1、启动4.…