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("point1和point2到原点的距离相等")
【运行测试】
四实验分析及问题思考
结合实例,比较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在面向对象程序设计方面的差异,也加深了对面向对象编程原则和注意事项的理解。这将有助于我更好地设计和编写面向对象的程序
标签:__,self,init,5.16,print,display,def From: https://www.cnblogs.com/wcy1111/p/18232266