Python编程实验六:面向对象应用

news2024/11/17 4:51:41

目录

一、实验目的与要求

二、实验内容

三、主要程序清单和程序运行结果

第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 = hours
        self._minutes = minutes
        self._seconds = seconds
    
    def hours(self):
        return self._hours
    
    def minutes(self):
        return self._minutes
    
    def seconds(self):
        return self._seconds
    
    def __eq__(self, other):
        if isinstance(other, Time):
            return (self._hours == other.hours() and
                    self._minutes == other.minutes() and
                    self._seconds == other.seconds())
        return False
    
    def __lt__(self, other):
        if isinstance(other, Time):
            if self._hours < other.hours():
                return True
            elif self._hours == other.hours():
                if self._minutes < other.minutes():
                    return True
                elif self._minutes == other.minutes():
                    if self._seconds < other.seconds():
                        return True
            return False
    
    def __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 // 3600
            minutes = (total_seconds % 3600) // 60
            seconds = (total_seconds % 3600) % 60
            return 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 // 3600
            minutes = (total_seconds % 3600) // 60
            seconds = (total_seconds % 3600) % 60
            return 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 = 0

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
        SchoolMember.total_members += 1

    def __del__(self):
        SchoolMember.total_members -= 1

    def 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 = title
        self.salary = salary
        self.prize = prize

    def get_total_income(self):
        return self.salary + self.prize

    def 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 = dept
        self.score = score

    def 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 member
            print(f"{name}注销成功")
            return
    print(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":
        break
    else:
        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.coloradmin.cn/o/1501669.html

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

相关文章

高级语言讲义2016计专(仅高级语言部分)

1.斐波那契序列的第n项可以表示成以下形式&#xff0c;编写一个非递归函数&#xff0c;返回该数列的第n项的数值 #include <stdio.h>int func(int n) {if(n1||n2)return 1;int p1,q1,num;for(int i3; i<n; i) {numpq;qp;pnum;}return num; } 2.在MXN的二维数组A中&am…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:LoadingProgress)

用于显示加载动效的组件。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 LoadingProgress() 创建加载进展组件。 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使…

k8s常用命令大全

k8s常用的命令 下面是一些常用的Kubernetes&#xff08;K8s&#xff09;命令&#xff0c;以及它们的简要说明。这些命令可以帮助您管理和操作Kubernetes集群中的资源。 集群管理命令&#xff1a; kubectl cluster-info: 显示集群的基本信息。 kubectl config use-context &l…

大语言模型如何充分理解人类自然语言指令

经过海量数据预训练后的语言模型虽然具备了大量的知识&#xff0c;但是由于其训练的目标仅是进行下一个词的预测&#xff0c;此时的模型还不能够理解并遵循人类自然语言的指令。指令微调(Instruction Tuning)&#xff0c;是指在已经训练好的语言模型的基础上&#xff0c;通过使…

【Vue+ElementUI】Table表格实现自定义表头展示+表头拖拽排序(附源码)

效果图 因项目采用的是Vue2&#xff0c;所以这个功能目前采用的是Vue2的写法。 Vue3请自行修改扩展代码&#xff1b;或收藏关注帖子&#xff0c;后续Vue3项目如有用到会在本帖子更新修改。 安装vuedraggable&#xff08;拖拽插件&#xff09; cnpm i vuedraggable先说用法&…

Mysql8的优化(DBA)

Mysql8的优化 1、Mysql的安装优化1.1 修改配置参数&#xff08;命令行、配件文件&#xff09;1.1.1 命令行修改配置参数1.1.2 参数持久化1.1.3 Mysql多实例启动&#xff0c;以及配置密码文件 1.2 查询表的相关参数&#xff0c;以及表空间管理 2、Mysql高级优化&#xff08;SQL&…

使用Opencv库直接进行人脸检测

import cv2abs_path cv2.__file__ xml_path abs_path.rsplit("/",1)[0] "/data/haarcascade_frontalface_default.xml"# 加载人脸检测器 face_cascade cv2.CascadeClassifier(xml_path)# 加载图像 img cv2.imread(/media/datasets/face/liuyigei_duo.…

逆向分析 FSViewer 并写出注册机

逆向分析 FSViewer 并写出注册机 FSViewer是一款老牌的图片管理查看编辑软件, 个人使用免费, 商用收费 本文将逆向分析FSViewer 7.5版本的注册算法并编写注册机 0. 前言 最近在整理之前的资料, 发现了一篇几年前刚学逆向那会儿写的文章, 是跟着看雪一位大牛的文章做的, 但逆向…

三井住友保险中国区信息技术部负责人陈婧,将出席“ISIG-RPA超级自动化产业发展峰会”

3月16日&#xff0c;第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导&#xff0c;企智未来科技&#xff08;RPA中国、AIGC开放社区、LowCode低码时代&#xff09;主办。大会旨在聚合每一位产业成员的力量&#xff0c;深入探索R…

Linux:预备

计算机结构基础 操作系统: 内核 (管理软硬件) shell(给用户使用操作系统的方式) 操作系统的目标 对硬件抽象 原因:操作系统是对软硬件资源管理的应用软件抽象:内存管理, 进程管理, 文件管理, 驱动管理软件:驱动程序(给软件提供访问硬件的软件)硬件:磁盘(对应文件), 网卡等隔离…

【C++】什么是类与对象?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 面向对象概述 面向对象是一种符合人类思维习惯的编程思想。现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系。在程序中使用对象来映射现实中的事物,使用对象的关…

基于SpringBoot+Vue+ElementUI+Mybatis前后端分离管理系统超详细教程(四)——前后端数据交互

经过前面几个章节的学习我们掌握了&#xff1a; 1、如何使用Vue快速搭建前端工程化项目&#xff0c;并结合elementUI优化了界面&#xff1b; 基于SpringBootVueElementUIMybatis前后端分离管理系统超详细教程&#xff08;一&#xff09; 基于SpringBootVueElementUIMybatis前后…

软件测试入门

文章目录 一、入门1. 软件2. 软件基本组成3. 软件产生过程4. 软件测试5. 软件测试目的&#x1f3c6; 小结 二、测试主流技能1. 功能测试2. 自动化测试3. 接口测试4. 性能测试&#x1f3c6; 小结 三、测试分类1. 按测试阶段划分2. 按代码可见度划分&#x1f3c6; 小结 三、质量模…

信息系统项目管理师003:信息化(1信息化发展—1.1信息与信息化—1.1.3 信息化)

文章目录 1.1.3 信息化1.信息化内涵2.信息化体系3.信息化趋势 要点总结 1.1.3 信息化 信息化是一个过程&#xff0c;与工业化、现代化一样&#xff0c;是一个动态变化的过程。信息化是指培养、发展以计算机为主的智能化工具为代表的新生产力&#xff0c;并使之造福于社会的历史…

通过sqoop把hive数据到mysql,脚本提示成功,mysql对应的表中没有数

1、脚本执行日志显示脚本执行成功&#xff0c;读写数量不为0 2、手动往Mysql对应表中写入数据十几秒后被自动删除了 问题原因&#xff1a; 建表时引擎用错了&#xff0c;如下图所示 正常情况下应该用InnoDB

7-4 哲哲打游戏(Python)

哲哲是一位硬核游戏玩家。最近一款名叫《达诺达诺》的新游戏刚刚上市&#xff0c;哲哲自然要快速攻略游戏&#xff0c;守护硬核游戏玩家的一切&#xff01; 为简化模型&#xff0c;我们不妨假设游戏有 N 个剧情点&#xff0c;通过游戏里不同的操作或选择可以从某个剧情点去往另…

偶极子和环形天线的辐射机理仿真分析

目录 0 引言 1 偶极子天线的辐射因素分析 1.1 偶极子天线模型设计 1.2 谐振点的出现规律 1.3 天线尺寸对辐射的影响 1.4 天线角度对辐射的影响

浅显易懂:WinForms、WPF和Electron的区别和优缺点

在开发桌面应用的时候&#xff0c;WinForms、WPF和Electron是绕不过去的三个技术栈&#xff0c;本文就详细据介绍了三者的区别和优缺点&#xff0c;帮助老铁们做个抉择。 一、winform wpf Electron 三者区别 WinForms、WPF和Electron是三种不同的框架和技术&#xff0c;用于开…

计算机中丢失缺少mfc100.dll文件该如何解决?

当你打开某个应用程序时&#xff0c;有时候会遇到一个“mfc100.dll丢失”或找不到mfc100.dll的错误信息提示。这种情况表明你的计算机缺少一个名为mfc100.dll的动态链接库文件。这个文件是由Microsoft VC 2010 Redistributable Package提供的&#xff0c;它是一组可重用的组件&…

【校园导航小程序】2.0版本 静态/云开发项目 升级日志

演示视频 【校园导航小程序】2.0版本 静态/云开发项目 演示 首页 重做了首页&#xff0c;界面更加高效和美观 校园指南页 新增了 “校园指南” 功能&#xff0c;可以搜索和浏览校园生活指南 地图页 ①弃用路线规划插件&#xff0c;改用SDK开发包。可以无阻通过审核并发布…