5.16

Python面向对象基础训练

班级: 信2205-1 学号:20224074  姓名:王晨宇

实验目的

l  使学生掌握Python下类与对象的基本应用;

l  使学生掌握Python下继承与多态的基本应用;

l  使学生掌握Python接口的基本应用;

l  使学生掌握Python异常处理的基本应用;

实验环境及实验准备

l  所需软件环境为Pyhton 3.x等;

l  掌握Python下类与对象、继承与多态的基本概念与应用;

l  掌握Python下接口的基本概念与应用;

l  掌握Python下异常处理的基本概念与应用

实验内容

(一)、设计高校人员信息包,并完成测试

题目描述】定义一个人员类People,其属性有:姓名、性别、年龄;基于People实现学生类Student,添加属性:学号、入学时间和入学成绩;基于People实现教师类Teacher,添加属性:职务、部门、工作时间;基于Student实现究生类Graduate,添加属性:研究方向和导师,分别定义其中的构造函数和输出函数。程序中定义各种类的对象,并完成测试。 基于以上类利用接口实现在职研究生类 GradOnWork。

【源代码程序】

class People:

    def __init__(self, name, gender, age):

        self.name = name

        self.gender = gender

        self.age = age

 

    def display_info(self):

        print(f"Name: {self.name}, Gender: {self.gender}, Age: {self.age}")

 

 

class Student(People):

    def __init__(self, name, gender, age, student_id, enrollment_date, entrance_score):

        super().__init__(name, gender, age)

        self.student_id = student_id

        self.enrollment_date = enrollment_date

        self.entrance_score = entrance_score

 

    def display_info(self):

        super().display_info()

        print(f"Student ID: {self.student_id}, Enrollment Date: {self.enrollment_date}, Entrance Score: {self.entrance_score}")

 

 

class Teacher(People):

    def __init__(self, name, gender, age, position, department, work_experience):

        super().__init__(name, gender, age)

        self.position = position

        self.department = department

        self.work_experience = work_experience

 

    def display_info(self):

        super().display_info()

        print(f"Position: {self.position}, Department: {self.department}, Work Experience: {self.work_experience}")

 

 

class Graduate(Student):

    def __init__(self, name, gender, age, student_id, enrollment_date, entrance_score, research_area, advisor):

        super().__init__(name, gender, age, student_id, enrollment_date, entrance_score)

        self.research_area = research_area

        self.advisor = advisor

 

    def display_info(self):

        super().display_info()

        print(f"Research Area: {self.research_area}, Advisor: {self.advisor}")

 

 

class GradOnWork(Graduate):

    def __init__(self, name, gender, age, student_id, enrollment_date, entrance_score, research_area, advisor, company):

        super().__init__(name, gender, age, student_id, enrollment_date, entrance_score, research_area, advisor)

        self.company = company

 

    def display_info(self):

        super().display_info()

        print(f"Currently working at: {self.company}")

 

 

# 创建对象并测试

student1 = Student("Alice", "Female", 20, "S001", "2021-09-01", 95)

teacher1 = Teacher("Bob", "Male", 35, "Professor", "Computer Science", "10 years")

graduate1 = Graduate("Charlie", "Male", 25, "G001", "2019-09-01", 90, "Machine Learning", "Dr. Smith")

grad_on_work1 = GradOnWork("David", "Male", 28, "G002", "2018-09-01", 88, "Data Science", "Dr. Johnson", "Tech Corp")

 

student1.display_info()

print("\n")

teacher1.display_info()

print("\n")

graduate1.display_info()

print("\n")

grad_on_work1.display_info()

【运行测试

 

(二)、以圆类为基础设计三维图形体系

题目描述】设计三维图形类体系,要求如下:

设计三维图形功能接口,接口包含周长、面积、体积计算方法;

基于以上接口,首先定义点类,应包含x,y坐标数据成员,坐标获取及设置方法、显示方法等;

以点类为基类派生圆类,增加表示半径的数据成员,半径获取及设置方法,重载显示函数,并可计算周长和面积等;

以圆类为基础派生球类、圆柱类、圆锥类;要求派生类球、圆柱、圆锥中都含有输入和输出显示方法;并可计算面积、周长。

程序中定义各种类的对象,并完成测试。

【源代码程序】

import math

 

# 三维图形功能接口

class ThreeDimensionalShape:

    def calculate_perimeter(self):

        pass

 

    def calculate_area(self):

        pass

 

    def calculate_volume(self):

        pass

 

 

# 点类

class Point:

    def __init__(self, x, y):

        self.x = x

        self.y = y

 

    def get_coordinates(self):

        return self.x, self.y

 

    def set_coordinates(self, x, y):

        self.x = x

        self.y = y

 

    def display(self):

        print(f"Point coordinates: ({self.x}, {self.y})")

 

 

# 圆类

class Circle(Point):

    def __init__(self, x, y, radius):

        super().__init__(x, y)

        self.radius = radius

 

    def calculate_perimeter(self):

        return 2 * math.pi * self.radius

 

    def calculate_area(self):

        return math.pi * self.radius ** 2

 

    def display(self):

        super().display()

        print(f"Radius: {self.radius}")

        print(f"Perimeter: {self.calculate_perimeter()}")

        print(f"Area: {self.calculate_area()}")

 

 

# 球类

class Sphere(Circle):

    def __init__(self, x, y, radius):

        super().__init__(x, y, radius)

 

    def calculate_volume(self):

        return (4/3) * math.pi * self.radius ** 3

 

    def display(self):

        super().display()

        print(f"Volume: {self.calculate_volume()}")

 

 

# 圆柱类

class Cylinder(Circle):

    def __init__(self, x, y, radius, height):

        super().__init__(x, y, radius)

        self.height = height

 

    def calculate_volume(self):

        return math.pi * self.radius ** 2 * self.height

 

    def display(self):

        super().display()

        print(f"Height: {self.height}")

        print(f"Volume: {self.calculate_volume()}")

 

 

# 圆锥类

class Cone(Circle):

    def __init__(self, x, y, radius, height):

        super().__init__(x, y, radius)

        self.height = height

 

    def calculate_volume(self):

        return (1/3) * math.pi * self.radius ** 2 * self.height

 

    def display(self):

        super().display()

        print(f"Height: {self.height}")

        print(f"Volume: {self.calculate_volume()}")

 

 

# 创建对象并测试

point1 = Point(1, 2)

point1.display()

 

circle1 = Circle(0, 0, 5)

circle1.display()

 

sphere1 = Sphere(0, 0, 5)

sphere1.display()

 

cylinder1 = Cylinder(0, 0, 5, 10)

cylinder1.display()

 

cone1 = Cone(0, 0, 5, 10)

cone1.display()

【运行测试

 

(三)、设计并实现计算不同职称的教师工资

题目描述】设计教师接口,该接口包含教师工资计算方法。应用(一)中的高校人员信息包,设计不同职称的教师类:教授,副教授,讲师,教师的基本信息包括姓名、性别、出生年月、职称、课时工作量等属性。注意学校对教师每月工资的计算规定如下:固定工资+课时补贴;教授的固定工资为5000元,每个课时补贴50元;副教授的固定工资为3000元,每个课时补贴30元;讲师的固定工资为2000元,每个课时补贴20元。

程序中定义各种教师类的对象,并编写程序求这些教师的月工资。

【源代码程序】

# 教师接口

class Teacher:

    def calculate_salary(self):

        pass

 

# 教授类

class Professor(Teacher):

    def __init__(self, name, gender, birthdate, teaching_hours):

        self.name = name

        self.gender = gender

        self.birthdate = birthdate

        self.title = "教授"

        self.teaching_hours = teaching_hours

 

    def calculate_salary(self):

        fixed_salary = 5000

        hourly_allowance = 50

        total_salary = fixed_salary + self.teaching_hours * hourly_allowance

        return total_salary

 

# 副教授类

class AssociateProfessor(Teacher):

    def __init__(self, name, gender, birthdate, teaching_hours):

        self.name = name

        self.gender = gender

        self.birthdate = birthdate

        self.title = "副教授"

        self.teaching_hours = teaching_hours

 

    def calculate_salary(self):

        fixed_salary = 3000

        hourly_allowance = 30

        total_salary = fixed_salary + self.teaching_hours * hourly_allowance

        return total_salary

 

# 讲师类

class Lecturer(Teacher):

    def __init__(self, name, gender, birthdate, teaching_hours):

        self.name = name

        self.gender = gender

        self.birthdate = birthdate

        self.title = "讲师"

        self.teaching_hours = teaching_hours

 

    def calculate_salary(self):

        fixed_salary = 2000

        hourly_allowance = 20

        total_salary = fixed_salary + self.teaching_hours * hourly_allowance

        return total_salary

 

# 创建教师对象并计算月工资

professor1 = Professor("张三", "", "1980-01-01", 50)

associate_professor1 = AssociateProfessor("李四", "", "1985-05-10", 40)

lecturer1 = Lecturer("王五", "", "1990-12-15", 30)

 

print(f"{professor1.name}的月工资为:{professor1.calculate_salary()}")

print(f"{associate_professor1.name}的月工资为:{associate_professor1.calculate_salary()}")

print(f"{lecturer1.name}的月工资为:{lecturer1.calculate_salary()}")

【运行测试

 

(四)、设计异常处理类Cexception,并基于异常处理类设计并实现日期类Date

题目描述】

定义一个异常类Cexception解决日期类实现中的自定义异常处理。设计的日期类应包含以下内容:

①  有三个成员数据:年、月、日;

②  有设置日期的成员函数;

③  有用格式"月/日/年"输出日期的成员函数;

④  要求在日期设置及有参构造函数中添加异常处理。

【源代码程序】

# 自定义异常类

class Cexception(Exception):

    def __init__(self, message):

        self.message = message

 

# 日期类

class Date:

    def __init__(self, year, month, day):

        self.year = year

        self.month = month

        self.day = day

        self.set_date(year, month, day)

 

    def set_date(self, year, month, day):

        try:

            if month < 1 or month > 12:

                raise Cexception("Invalid month")

            if day < 1 or day > 31:

                raise Cexception("Invalid day")

            self.year = year

            self.month = month

            self.day = day

        except Cexception as e:

            print(f"Exception: {e.message}")

 

    def output_date(self):

        return f"{self.month}/{self.day}/{self.year}"

 

# 创建日期对象并测试异常处理

try:

    date1 = Date(2024, 5, 10)

    print(date1.output_date())

    date2 = Date(2024, 13, 40)  # 月份和日期超出范围,会触发异常处理

except Cexception as e:

    print(f"Exception occurred: {e.message}")

 

【运行测试

 

 

(五)、设计并实现平面点类Point

【题目描述】

定义一个平面点类Point,对其重载运算符关系运算符,关系运算以距离坐标原点的远近作为基准,远的为大。程序完成对其的测试。

【源代码程序】

import math

 

# 定义平面点类

class Point:

    def __init__(self, x, y):

        self.x = x

        self.y = y

 

    def distance_to_origin(self):

        return math.sqrt(self.x ** 2 + self.y ** 2)

 

    # 重载小于运算符

    def __lt__(self, other):

        return self.distance_to_origin() < other.distance_to_origin()

 

    # 重载大于运算符

    def __gt__(self, other):

        return self.distance_to_origin() > other.distance_to_origin()

 

# 创建点对象并进行测试

point1 = Point(3, 4)

point2 = Point(1, 1)

 

if point1 > point2:

    print("point1离原点更远")

elif point1 < point2:

    print("point2离原点更远")

else:

    print("point1point2到原点的距离相等")

 

【运行测试

 

 

实验分析及问题思考

结合实例,比较Python与Java在类的定义、继承、多态等方面的异同,总结Python面向对象程序设计中的原则和注意事项。

【答案】

Python中不需要指定访问修饰符(如public、private),默认为公开访问;而Java中需要显式指定访问修饰符。

Python中可以在类中直接定义属性和方法,而Java中需要在类中定义属性和方法。Python中使用class SubClass(BaseClass)来表示继承关系,Java中使用class SubClass extends BaseClass。

Python支持多重继承,一个子类可以继承多个父类;而Java不支持多重继承,一个子类只能继承一个父类。

总结:类是对象的模板,对象是类的实例。通过类创建对象,可以对对象进行操作和访问属性和方法。避免使用全局变量:尽量将数据和方法封装在类中,避免使用全局变量,提高代码的可维护性和可重用性。允许不同的子类对象对同一方法做出不同的响应,提高代码的灵活性和可扩展性。

 

 

 


Python面向对象基础训练

班级:信2205-1 学号:20224074  姓名:王晨宇

实验自评

实验内容

自评结果(在对应格内打ü

不熟练

一般

比较熟练

熟练

Pyhton类的定义

 

 

 

ü

Pyhton类的继承

 

 

 

ü

Python多态实现

 

 

 

ü

Python接口实现

 

 

 

ü

Python自定义异常结构

 

 

 

ü

实验体会

我意识到封装、继承、多态等概念是面向对象编程的重要基础,合理运用这些概念可以提高代码的可维护性、可扩展性和可重用性。另外,避免使用全局变量、尽量将数据和方法封装在类中也是提高代码质量的重要手段。通过这次实验,我更深入地理解了Python和Java在面向对象程序设计方面的差异,也加深了对面向对象编程原则和注意事项的理解。这将有助于我更好地设计和编写面向对象的程序

posted @ 2024-06-05 09:17  晨观夕  阅读(6)  评论(0编辑  收藏  举报