目录
一、实验目的与要求
(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)要应用运算符重载
python
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()函数输出每个对象的相关信息
python
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面向对象编程有了更深入的理解,也提高了我的编程技能。我认为,面向对象编程不仅是一种编程范式,更是一种思维方式,它可以帮助我们更好地分析问题,设计解决方案。