实验五 面向对象程序设计
一、实验学时:2学时
二、实验目的
- 掌握:Python类的定义,class关键字,创建对象的方法,访问对象中的成员。
- 掌握:私有成员与公有成员,数据成员与成员方法,类方法与静态方法,属性的定义与使用,混入机制
- 掌握:继承的作用与Python实现。
- 掌握:构造函数 __ init __ (),析构函数__ del __ (),__ dd __ ()、__ mul __ ()、__ pow __ ()及其他Python类特殊方法与运算符的对应关系。
三、实验内容
- 有下面的类属性:姓名、年龄、成绩列表[语文,数学,英语],其中每门课成绩的类型为整数,类的方法如下所述:
(1) 列表项列表项获取学生的姓名。get_name(),返回类型:str。
(2) 获取学生的年龄。get_age(),返回类型:int。
(3) 返回3门科目中最高的分数。get_course(), 返回类型:int。
类定义好之后,可以定义同学测试如下: zm = Student(‘zhangming’,20,[69,88,100]);返回结果: zhangming 20 100 - 设计一个Circle(圆)类,包括圆心位置、半径、颜色等属性。编写构造方法和其他方法,计算周长和面积。请编写程序验证Circle(圆)类的功能。
- 封装一个学生类,有姓名,有年龄,有性别,有英语成绩,数学成绩,语文成绩;求总分,平均分,以及打印输出学生的相关信息。
- 设计一个Person类,属性有姓名、年龄、性别,创建方法personInfo,打印输出这个人的信息;创建Student类,继承Person类,属性有学院college,班级Group,重写父类PersonInfo方法,调用父类方法打印输出个人信息,将学生的学院、班级信息也打印输出出来。
- 定义一个交通工具(Vehicle)的类,属性:速度(speed)、体积(size)等等。方法:移动move()、设置速度setSpeed(int speed)、加速speedUp()、减速speedDown()等等。实例化一个交通工具对象,通过方法初始化speed、size的值并且在相关方法中可以打印输出出来;另外调用加速减速的方法对速度进行改变。
四、实验结果
- 有下面的类属性:姓名、年龄、成绩列表[语文,数学,英语],其中每门课成绩的类型为整数,类的方法如下所述:
(1) 列表项列表项获取学生的姓名。get_name(),返回类型:str。
(2) 获取学生的年龄。get_age(),返回类型:int。
(3) 返回3门科目中最高的分数。get_course(), 返回类型:int。
类定义好之后,可以定义同学测试如下: zm = Student(‘zhangming’,20,[69,88,100]);返回结果: zhangming 20 100
题目思路:
写Student类,__init__函数中设置默认初始化参数,注意成绩列表的默认参数应是[0,0,0],对于后面三个方法,注意设置返回类型。题目对返回类型有要求。返回最高分数可以直接用max函数对列表求最大值。
程序代码:
"""
程序名:实验5.1.py
功能:有下面的类属性:姓名、年龄、成绩列表[语文,数学,英语],其中每门课成绩的类型为整数,类的方法如下所述:
(1)列表项列表项获取学生的姓名。get_name(),返回类型:str。
(2)获取学生的年龄。get_age(),返回类型:int。
(3)返回3门科目中最高的分数。get_course(), 返回类型:int。
类定义好之后,可以定义同学测试如下: zm = Student('zhangming',20,[69,88,100]);返回结果: zhangming 20 100
日期:2022.4.14
版本:1.0
"""
class Student: # Student类的定义
def __init__(self, s_name=None, s_age=0, s_course=None): # 带默认参数的初始化
# 类里面获取实例属性
if s_course is None:
self.s_course = [0, 0, 0]
else:
self.s_course = s_course
self.s_name = s_name
self.s_age = s_age
print(f"\"Student\"对象已经创建")
def __del__(self): # 删除对象
print(f"\"Student\"对象已经被删除")
def __str__(self): # 返回一个对象的描述信息
return f"{self.s_name}"
def get_name(self) -> str: # 获取学生的姓名 返回类型为str
return self.s_name
def get_age(self) -> int: # 获取学生的年龄 返回类型为int
return self.s_age
def get_course(self) -> int: # 返回3门科目中最高的分数 返回类型为 int
return max(self.s_course)
zm = Student('zhangming', 20, [69, 88, 100])
print()
print(zm.get_name(), zm.get_age(), zm.get_course(), end=' ')
print("\n")
运行结果截图:
- 设计一个Circle(圆)类,包括圆心位置、半径、颜色等属性。编写构造方法和其他方法,计算周长和面积。请编写程序验证Circle(圆)类的功能。
题目思路:
和第一题类似,定义Circle类,在__init__函数中对圆心位置,半径,颜色进行默认初始化。编写circumference()和area()函数分别计算周长和面积,注意π在math函数中,用math.pi调用。
程序代码:
"""
程序名:实验5.2.py
功能:设计一个Circle(圆)类,包括圆心位置、半径、颜色等属性。
编写构造方法和其他方法,计算周长和面积。
请编写程序验证Circle(圆)类的功能。
日期:2022.4.14
版本:1.0
"""
import math
class Circle: # Circle类的定义
def __init__(self, c_center=None, c_radius=0, c_color=None): # 带默认参数的初始化
# 类里面获取实例属性
if c_center is None:
self.center = (0, 0)
else:
self.center = c_center
self.radius = c_radius
self.color = c_color
print(f"\"Circle\"对象已经创建")
def __del__(self): # 删除对象
print(f"\"Circle\"对象已经被删除")
def __str__(self): # 返回一个对象的描述信息
return f"\"{self}\""
def get_center(self): # 获取圆心
return self.center
def get_radius(self): # 获取半径
return self.radius
def get_color(self): # 获取颜色
return self.color
def show(self): # 显示信息
print(f"圆心:{self.center} 半径:{self.radius} 颜色:{self.color} ")
def circumference(self): # 求周长
return math.pi * 2 * self.radius
def area(self): # 求面积
return math.pi * self.radius * self.radius
c = Circle((1, 2), 3, '蓝')
print()
c.show()
print(f"周长为:{c.circumference():.2f}\n面积为:{c.area():.2f}") # 格式化输出周长面积
print()
运行结果截图:
- 封装一个学生类,有姓名,有年龄,有性别,有英语成绩,数学成绩,语文成绩;求总分,平均分,以及打印输出学生的相关信息。
题目思路:
和第一题非常类似,成绩用列表来存储,求总分可以使用sum函数进行计算,平均分可以用总分/len()函数来计算。
程序代码:
"""
程序名:实验5.3.py
功能:封装一个学生类,有姓名,有年龄,有性别,有英语成绩,数学成绩,语文成绩;
求总分,平均分,以及打印输出学生的相关信息。
日期:2022.4.14
版本:1.0
"""
class Student: # Student类的定义
def __init__(self, s_name=None, s_age=0, s_sex=None, s_course=None): # 带默认参数的初始化
# 类里面获取实例属性
if s_course is None:
self.s_course = [0, 0, 0]
else:
self.s_course = s_course
self.s_name = s_name
self.s_age = s_age
self.s_sex = s_sex
print(f"\"Student\"对象已经创建")
def __del__(self): # 删除对象
print(f"\"Student\"对象已经被删除")
def __str__(self): # 返回一个对象的描述信息
return f"{self.s_name}"
def get_name(self): # 获取学生的姓名
return self.s_name
def get_age(self): # 获取学生的年龄
return self.s_age
def get_sex(self): # 获取学生的性别
return self.s_sex
def show(self): # 显示信息
print(f"姓名:{self.s_name} 年龄:{self.s_age} 性别:{self.s_sex}"
f"\n英语:{self.s_course[0]} 数学:{self.s_course[1]} 语文:{self.s_course[2]}")
def get_total(self): # 获取总分
return sum(self.s_course)
def get_average(self): # 获取平局分
return self.get_total() / len(self.s_course)
s1 = Student("宋抗非", 19, "男", [99, 80.5, 60.5])
print()
s1.show()
print(f"总分为:{s1.get_total():.1f} 平均分为:{s1.get_average():.1f}") # 格式化输出总分和平均分
print()
运行结果截图:
- 设计一个Person类,属性有姓名、年龄、性别,创建方法personInfo,打印输出这个人的信息;创建Student类,继承Person类,属性有学院college,班级Group,重写父类personInfo方法,调用父类方法打印输出个人信息,将学生的学院、班级信息也打印输出出来。
题目思路:Person类的编写和前三题类似,Student类继承Person类,在__init__函数中需要对超类__init__进行调用。重写父类personInfo方法,在其中调用父类方法打印出个人信息,再写输出函数将学院和班级也额外打印出来。
程序代码:
"""
程序名:实验5.4.py
功能:设计一个Person类,属性有姓名、年龄、性别,创建方法personInfo,打印输出这个人的信息;
创建Student类,继承Person类,属性有学院college,班级Group,
重写父类PersonInfo方法,调用父类方法打印输出个人信息,将学生的学院、班级信息也打印输出出来。
日期:2022.4.14
版本:1.0
"""
class Person(object): # Person类定义
def __init__(self, p_name=None, p_age=0, p_sex=None): # 带默认参数的初始化
# 类里面获取实例属性
self.name = p_name
self.age = p_age
self.sex = p_sex
print(f"\"Person\"对象已经创建")
def __del__(self): # 删除对象
print(f"\"Person\"对象已经被删除")
def __str__(self): # 返回一个对象的描述信息
return f"{self.name}"
def personInfo(self):
print(f"姓名:{self.name} 年龄:{self.age} 性别:{self.sex}")
class Student(Person):
def __init__(self, s_name=None, s_age=0, s_sex=None, s_college=None, s_group=0): # 带默认参数的初始化
super(Student, self).__init__(s_name, s_age, s_sex) # 对超类__init__的调用
# 类里面获取实例属性
self.college = s_college
self.group = s_group
print(f"\"Student\"对象已经创建")
def __del__(self): # 删除对象
print(f"\"Student\"对象已经被删除")
def __str__(self): # 返回一个对象的描述信息
return f"{self.name}"
def personInfo(self): # 重写父类PersonInfo方法
super().personInfo() # 调用父类方法打印输出个人信息
print(f"学院:{self.college} 班级:{self.group}")
person1 = Person("宋抗非", 19, "男")
student1 = Student("宋抗非", 19, "男", "软件学院", 1)
print()
person1.personInfo()
print()
student1.personInfo()
print()
运行结果截图:
5.定义一个交通工具(Vehicle)的类,属性:速度(speed)、体积(size)等等。方法:移动move()、设置速度setSpeed(int speed)、加速speedUp()、减速speedDown()等等。实例化一个交通工具对象,通过方法初始化speed、size的值并且在相关方法中可以打印输出出来;另外调用加速减速的方法对速度进行改变。
题目思路:
定义Vehicle类,其中属性为speed和size,设置速度即改变speed的值即可,加速设置最大速度,速度超过即提示超速,减速需要考虑速度为0。速度为0即停下。打印输出可以通过重写__str__方法或者编写show函数来实现。
程序代码:
"""
程序名:实验5.5.py
功能:定义一个交通工具(Vehicle)的类,属性:速度(speed)、体积(size)等等。
方法:移动move()、设置速度setSpeed(int speed)、加速speedUp()、减速speedDown()等等。
实例化一个交通工具对象,通过方法初始化speed、size的值并且在相关方法中可以打印输出出来;
另外调用加速减速的方法对速度进行改变。
日期:2022.4.14
版本:1.0
"""
class Vehicle: # Vehicle类的定义
def __init__(self, v_speed=0, v_size=0): # 带默认参数的初始化
# 类里面获取实例属性
self.speed = v_speed
self.size = v_size
print(f"\"Vehicle\"对象已经创建")
def __del__(self): # 删除对象
print(f"\"Vehicle\"对象已经被删除")
def __str__(self): # 返回一个对象的描述信息
return f"目前时速为:{self.speed}km/h 车辆体积为:{self.size}m³"
def show(self):
print(f"目前时速为:{self.speed}km/h 车辆体积为:{self.size}m³")
def move(self): # 移动
print("开始移动······")
def setSpeed(self, speed: int): # 设置speed的值
self.speed = speed
def setSize(self, size: int): # 设置size的值
self.size = size
def speedUp(self, up):
print("开始加速······")
self.speed += up
print(f"目前时速为:{self.speed}km/h")
if self.speed > 60:
print("已超速!请减速!")
def speedDown(self, down):
print("开始减速······")
self.speed -= down
if self.speed - down < 0:
print("车速降为0,车辆已停下")
else:
print(f"你现在的时速为:{self.speed}km/h")
car1 = Vehicle(0, 60)
print()
car1.move()
car1.setSpeed(20)
car1.show()
car1.speedUp(50)
print(car1)
car1.speedDown(70)
print()
运行结果截图:
五、实验小结
问题和解决方法:
- 不知道如何设置函数中返回值的类型和参数的类型。
解决方法:通过查询相关内容得知,类似def get_course(self,course:int) -> int: 这样的写法表示参数course需要输入int类型,而函数的返回类型也是int类型。 - 在写类的继承中,写子类的构造函数时报错。
解决方法:在写子类构造时需要对超类的构造进行调用,并且需要往里面传参数。 - 对类中一些特殊方法/魔术方法不熟悉。
解决方法:通过查询书以及上网查询得到解决。
心得体会:
- 在写python类的时候类比C++中的内容,都有构造函数、析构函数等等,Python中类的创建包括类本身和类对象(实例)两部分,类比于C++类中的静态成员变量/方法和类成员变量/方法。在学习python类的过程中,主要是要熟悉类定义时的语法,和各种特殊方法的使用,以及应用条件。感觉到自己写代码的熟练度越来越强了。
- 在python定义类的时候需要注意的有:类属性和类方法在内存中只有一份,所有类对象共用一份。 类对象的成员属性是通过(构造函数)进行定义并进行初始化的。类对象的成员方法构建方法和函数构建方法一样。