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 更严格,适合大型复杂项目
posted @ 2025-05-29 21:43  f-52Hertz  阅读(23)  评论(0)    收藏  举报