python实验2
一 实验目的
使学生掌握Python下类与对象的基本应用;
使学生掌握Python下继承与多态的基本应用;
使学生掌握Python接口的基本应用;
使学生掌握Python异常处理的基本应用;
二 实验环境及实验准备
所需软件环境为Pyhton 3.x等;
掌握Python下类与对象、继承与多态的基本概念与应用;
掌握Python下接口的基本概念与应用;
掌握Python下异常处理的基本概念与应用
三 实验内容
(一)、设计高校人员信息包,并完成测试
【题目描述】定义一个人员类People,其属性有:姓名、性别、年龄;基于People实现学生类Student,添加属性:学号、入学时间和入学成绩;基于People实现教师类Teacher,添加属性:职务、部门、工作时间;基于Student实现究生类Graduate,添加属性:研究方向和导师,分别定义其中的构造函数和输出函数。程序中定义各种类的对象,并完成测试。 基于以上类利用接口实现在职研究生类 GradOnWork。
【源代码程序】
定义人员类 People
class People:
def init(self, name, gender, age):
self.name = name
self.gender = gender
self.age = age
def display(self):
# 输出人员的基本信息
print(f"姓名: {self.name}, 性别: {self.gender}, 年龄: {self.age}")
定义学生类 Student,继承自 People
class Student(People):
def init(self, name, gender, age, student_id, enrollment_date, enrollment_score):
super().init(name, gender, age)
self.student_id = student_id
self.enrollment_date = enrollment_date
self.enrollment_score = enrollment_score
def display(self):
# 输出学生的具体信息
super().display()
print(f"学号: {self.student_id}, 入学时间: {self.enrollment_date}, 入学成绩: {self.enrollment_score}")
定义教师类 Teacher,继承自 People
class Teacher(People):
def init(self, name, gender, age, position, department, working_hours):
super().init(name, gender, age)
self.position = position
self.department = department
self.working_hours = working_hours
def display(self):
# 输出教师的具体信息
super().display()
print(f"职务: {self.position}, 部门: {self.department}, 工作时间: {self.working_hours}")
定义研究生类 Graduate,继承自 Student
class Graduate(Student):
def init(self, name, gender, age, student_id, enrollment_date, enrollment_score, research_direction, advisor):
super().init(name, gender, age, student_id, enrollment_date, enrollment_score)
self.research_direction = research_direction
self.advisor = advisor
def display(self):
# 输出研究生的具体信息
super().display()
print(f"研究方向: {self.research_direction}, 导师: {self.advisor}")
定义在职研究生类 GradOnWork,基于接口实现
class GradOnWork:
def init(self, name, gender, age, student_id, enrollment_date, enrollment_score, research_direction, advisor, company):
self.graduate = Graduate(name, gender, age, student_id, enrollment_date, enrollment_score, research_direction, advisor)
self.company = company
def display(self):
# 输出在职研究生的具体信息
self.graduate.display()
print(f"公司: {self.company}")
测试用例
if name == "main":
print("=== 测试人员类 ===")
people = People("张三", "男", 30)
people.display()
print("\n=== 测试学生类 ===")
student = Student("李四", "女", 20, "S123", "2023-09-01", 95)
student.display()
print("\n=== 测试教师类 ===")
teacher = Teacher("王五", "男", 40, "教授", "计算机科学", 40)
teacher.display()
print("\n=== 测试研究生类 ===")
graduate = Graduate("赵六", "女", 23, "G456", "2020-09-01", 90, "人工智能", "张教授")
graduate.display()
print("\n=== 测试在职研究生类 ===")
grad_on_work = GradOnWork("孙七", "女", 25, "GW789", "2021-09-01", 92, "机器学习", "李教授", "某科技公司")
grad_on_work.display()
【运行测试】
(二)、以圆类为基础设计三维图形体系
【题目描述】设计三维图形类体系,要求如下:
设计三维图形功能接口,接口包含周长、面积、体积计算方法;
基于以上接口,首先定义点类,应包含x,y坐标数据成员,坐标获取及设置方法、显示方法等;
以点类为基类派生圆类,增加表示半径的数据成员,半径获取及设置方法,重载显示函数,并可计算周长和面积等;
以圆类为基础派生球类、圆柱类、圆锥类;要求派生类球、圆柱、圆锥中都含有输入和输出显示方法;并可计算面积、周长。
程序中定义各种类的对象,并完成测试。
【源代码程序】
import math
定义三维图形功能接口
class Shape3D:
def perimeter(self):
pass
def area(self):
pass
def volume(self):
pass
定义点类 Point
class Point:
def init(self, x, y):
self.x = x
self.y = y
def set_coordinates(self, x, y):
self.x = x
self.y = y
def display(self):
# 输出点的坐标
print(f"点坐标: ({self.x}, {self.y})")
定义圆类 Circle,继承自 Point
class Circle(Point):
def init(self, x, y, radius):
super().init(x, y)
self.radius = radius
def set_radius(self, radius):
self.radius = radius
def display(self):
# 输出圆的信息
super().display()
print(f"半径: {self.radius}")
def perimeter(self):
return 2 * math.pi * self.radius
def area(self):
return math.pi * self.radius ** 2
定义球类 Sphere,继承自 Circle 和 Shape3D
class Sphere(Circle, Shape3D):
def init(self, x, y, radius):
super().init(x, y, radius)
def display(self):
# 输出球的信息
super().display()
print(f"球表面积: {self.area()}, 球体积: {self.volume()}")
def area(self):
return 4 * math.pi * self.radius ** 2
def volume(self):
return (4 / 3) * math.pi * self.radius ** 3
定义圆柱类 Cylinder,继承自 Circle 和 Shape3D
class Cylinder(Circle, Shape3D):
def init(self, x, y, radius, height):
super().init(x, y, radius)
self.height = height
def display(self):
# 输出圆柱的信息
super().display()
print(f"高度: {self.height}, 表面积: {self.area()}, 体积: {self.volume()}")
def area(self):
return 2 * math.pi * self.radius * (self.radius + self.height)
def volume(self):
return math.pi * self.radius ** 2 * self.height
测试用例
if name == "main":
print("=== 测试点类 ===")
point = Point(1, 2)
point.display()
print("\n=== 测试圆类 ===")
circle = Circle(0, 0, 5)
circle.display()
print(f"圆的周长: {circle.perimeter()}")
print(f"圆的面积: {circle.area()}")
print("\n=== 测试球类 ===")
sphere = Sphere(0, 0, 5)
sphere.display()
print("\n=== 测试圆柱类 ===")
cylinder = Cylinder(0, 0, 5, 10)
cylinder.display()
【运行测试】
(三)、设计并实现计算不同职称的教师工资
【题目描述】设计教师接口,该接口包含教师工资计算方法。应用(一)中的高校人员信息包,设计不同职称的教师类:教授,副教授,讲师,教师的基本信息包括姓名、性别、出生年月、职称、课时工作量等属性。注意学校对教师每月工资的计算规定如下:固定工资+课时补贴;教授的固定工资为5000元,每个课时补贴50元;副教授的固定工资为3000元,每个课时补贴30元;讲师的固定工资为2000元,每个课时补贴20元。
程序中定义各种教师类的对象,并编写程序求这些教师的月工资。
【源代码程序】
定义教师类 Teacher
class Teacher:
def init(self, name, gender, birth_date, title, teaching_hours):
self.name = name
self.gender = gender
self.birth_date = birth_date
self.title = title
self.teaching_hours = teaching_hours
def calculate_salary(self):
# 该方法将在子类中重写
pass
def display(self):
# 输出教师基本信息
print(f"姓名: {self.name}, 性别: {self.gender}, 出生日期: {self.birth_date}, 职称: {self.title}, 教学课时: {self.teaching_hours}")
定义教授类 Professor,继承自 Teacher
class Professor(Teacher):
def calculate_salary(self):
base_salary = 5000 # 固定工资
hourly_bonus = 50 # 每课时补贴
return base_salary + self.teaching_hours * hourly_bonus
定义副教授类 AssociateProfessor,继承自 Teacher
class AssociateProfessor(Teacher):
def calculate_salary(self):
base_salary = 3000 # 固定工资
hourly_bonus = 30 # 每课时补贴
return base_salary + self.teaching_hours * hourly_bonus
定义讲师类 Lecturer,继承自 Teacher
class Lecturer(Teacher):
def calculate_salary(self):
base_salary = 2000 # 固定工资
hourly_bonus = 20 # 每课时补贴
return base_salary + self.teaching_hours * hourly_bonus
测试用例
if name == "main":
print("=== 测试教授类 ===")
professor = Professor("张教授", "男", "1970-05-20", "教授", 40)
professor.display()
print(f"月工资: {professor.calculate_salary()} 元")
print("\n=== 测试副教授类 ===")
associate_professor = AssociateProfessor("李副教授", "女", "1980-09-15", "副教授", 30)
associate_professor.display()
print(f"月工资: {associate_professor.calculate_salary()} 元")
print("\n=== 测试讲师类 ===")
lecturer = Lecturer("王讲师", "男", "1990-01-10", "讲师", 25)
lecturer.display()
print(f"月工资: {lecturer.calculate_salary()} 元")
【运行测试】
(四)、设计异常处理类Cexception,并基于异常处理类设计并实现日期类Date
【题目描述】
定义一个异常类Cexception解决日期类实现中的自定义异常处理。设计的日期类应包含以下内容:
① 有三个成员数据:年、月、日;
② 有设置日期的成员函数;
③ 有用格式"月/日/年"输出日期的成员函数;
④ 要求在日期设置及有参构造函数中添加异常处理。
【源代码程序】
定义自定义异常类 Cexception
class Cexception(Exception):
def init(self, message):
super().init(message)
定义日期类 Date
class Date:
def init(self, year, month, day):
self.set_date(year, month, day)
def set_date(self, year, month, day):
# 检查月份是否合法
if not (1 <= month <= 12):
raise Cexception("无效的月份!必须在 1 到 12 之间。")
# 检查日期是否合法
if not (1 <= day <= self.days_in_month(year, month)):
raise Cexception(f"无效的日期!对于{month}月,日期必须在 1 到 {self.days_in_month(year, month)} 之间。")
self.year = year
self.month = month
self.day = day
def display(self):
# 输出日期信息
print(f"日期: {self.month}/{self.day}/{self.year}")
@staticmethod
def is_leap_year(year):
# 判断是否为闰年
return (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
@staticmethod
def days_in_month(year, month):
# 获取指定月份的天数
if month in [1, 3, 5, 7, 8, 10, 12]:
return 31
elif month in [4, 6, 9, 11]:
return 30
elif month == 2:
return 29 if Date.is_leap_year(year) else 28
else:
raise Cexception("无效的月份!")
测试用例
if name == "main":
try:
print("=== 测试有效日期 ===")
valid_date = Date(2024, 2, 29) # 闰年
valid_date.display()
print("\n=== 测试无效日期 ===")
invalid_date = Date(2023, 2, 29) # 非闰年
invalid_date.display()
except Cexception as e:
print(f"错误: {e}")
【运行测试】
(五)、设计并实现平面点类Point
【题目描述】
定义一个平面点类Point,对其重载运算符关系运算符,关系运算以距离坐标原点的远近作为基准,远的为大。程序完成对其的测试。
【源代码程序】
import math
定义平面点类 Point
class Point:
def init(self, x, y):
self.x = x
self.y = y
def distance_from_origin(self):
# 计算点到原点的距离
return math.sqrt(self.x ** 2 + self.y ** 2)
# 重载小于运算符
def __lt__(self, other):
return self.distance_from_origin() < other.distance_from_origin()
# 重载小于等于运算符
def __le__(self, other):
return self.distance_from_origin() <= other.distance_from_origin()
# 重载大于运算符
def __gt__(self, other):
return self.distance_from_origin() > other.distance_from_origin()
# 重载大于等于运算符
def __ge__(self, other):
return self.distance_from_origin() >= other.distance_from_origin()
# 重载等于运算符
def __eq__(self, other):
return self.distance_from_origin() == other.distance_from_origin()
# 重载不等于运算符
def __ne__(self, other):
return self.distance_from_origin() != other.distance_from_origin()
def display(self):
# 输出点的信息
print(f"点坐标: ({self.x}, {self.y}),到原点的距离: {self.distance_from_origin()}")
测试用例
if name == "main":
print("=== 测试点类 ===")
point1 = Point(3, 4)
point2 = Point(6, 8)
point1.display()
point2.display()
print(f"\nPoint1 是否小于 Point2? {point1 < point2}")
print(f"Point1 是否等于 Point2? {point1 == point2}")
print(f"Point1 是否大于 Point2? {point1 > point2}")
【运行测试】
四 实验分析及问题思考
结合实例,比较Python与Java在类的定义、继承、多态等方面的异同,总结Python面向对象程序设计中的原则和注意事项。
【答案】# Python 与 Java 的类定义、继承、多态对比
类的定义
Python
- 使用
class关键字定义类 - 动态类型语言,不需要显式声明成员变量类型
- 构造函数为
__init__
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def display(self):
print(f"姓名: {self.name}, 年龄: {self.age}")
Java
- 使用
class关键字定义类 - 强类型语言,必须显式声明成员变量类型
- 构造函数与类名相同
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void display() {
System.out.println("姓名: " + name + ", 年龄: " + age);
}
}
继承
Python
- 使用
class Child(Parent)定义子类 - 支持多继承
class Student(Person):
def __init__(self, name, age, student_id):
super().__init__(name, age)
self.student_id = student_id
Java
- 使用
extends关键字定义子类 - 不支持多继承,但支持接口
public class Student extends Person {
private String studentId;
public Student(String name, int age, String studentId) {
super(name, age);
this.studentId = studentId;
}
}
多态
Python
- 使用动态类型实现多态
- 方法可以被重写
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
print("汪汪!")
Java
- 使用方法重写和接口实现多态
public class Animal {
public void speak() {}
}
public class Dog extends Animal {
@Override
public void speak() {
System.out.println("汪汪!");
}
}
总结
- Python 灵活,适合快速开发
- Java 更严格,适合大型复杂项目
浙公网安备 33010602011771号