实验五 面向对象程序设计
一、实验学时: 2学时
二、实验目的
- 掌握:Python类的定义,class关键字,创建对象的方法,访问对象中的成员。
- 掌握:私有成员与公有成员,数据成员与成员方法,类方法与静态方法,属性的定义与使用,混入机制。
- 掌握:继承的作用与Python实现。
- 掌握:构造函数 __ init __ (),析构函数__ del __ (),__ dd __ ()、__ mul __ ()、__ pow __ ()及其他Python类特殊方法与运算符的对应关系。
三、实验内容
- 有下面的类属性:姓名、年龄、成绩列表[语文,数学,英语],其中每门课成绩的类型为整数,类的方法如下所述:
(1)列表项列表项获取学生的姓名。get_name(),返回类型:str。
(2)获取学生的年龄。get_age(),返回类型:int。
(3)返回3门科目中最高的分数。get_course(), 返回类型:int。
(4)类定义好之后,可以定义同学测试如下: 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。
(4)类定义好之后,可以定义同学测试如下: zm = Student(‘zhangming’,20,[69,88,100]);返回结果: zhangming 20 100
代码块:
# 程序名:test5.1
# 有下面的类属性:姓名、年龄、成绩列表[语文,数学,英语],其中每门课成绩的类型为整数编写函数,接收一个字符串,分别统计大写字母、小写字母、数字、其他字符的个数,并以元组的形式返回结果。
# 日 期:2023.4.29
# 思 路:利用类的特性编写相应的函数即可
class Student:
def __init__(self, name, age, course):
self.name = name
self.age = age
self.course = course
# 列表项列表项获取学生的姓名
def get_name(self):
name = self.name
print("学生的姓名为:", name)
return str(name)
# 获取学生的年龄
def get_age(self):
age = self.age
print("学生的年龄为:", age)
return int(age)
# 返回3门科目中最高的分数
def get_course(self):
max_ = 0
for i in self.course:
if i > max_:
max_ = i
print("3门科目分数最高的分数是:", max_)
return int(max_)
zm = Student('zhangming',20,[69, 88, 100])
zm.get_name()
zm.get_age()
zm.get_course()
-
设计一个Circle(圆)类,包括圆心位置、半径、颜色等属性。编写构造方法和其他方法,计算周长和面积。请编写程序验证Circle(圆)类的功能。
代码块:
# 程序名:test5.2 # 设计一个Circle(圆)类,包括圆心位置、半径、颜色等属性。编写构造方法和其他方法,计算周长和面积。请编写程序验证Circle(圆)类的功能。 # 作 者:王鑫 # 学 号:20222501792 # 日 期:2023.4.29 # 思 路:利用类的特性编写相应的函数即可 import math class Circle: def __init__(self, center, radius, color): self.center = center self.radius = radius self.color = color def show(self): print("圆的圆心为:",self.center) print("圆的半径为:",self.radius) print("圆的面积为:",self.color) # 计算圆的面积 def get_Area(self): area = self.radius * self.radius * math.pi print("圆的面积为:", float(area)) # 计算圆的周长 def get_Perimeter(self): perimeter = self.radius * math.pi * 2 print("圆的周长为:", float(perimeter)) c = Circle((0,0), 5, "红色") c.show() c.get_Area() c.get_Perimeter()
-
封装一个学生类,有姓名,有年龄,有性别,有英语成绩,数学成绩,语文成绩;求总分,平均分,以及打印输出学生的相关信息。
代码块:
# 程序名:test5.3 # 封装一个学生类,有姓名,有年龄,有性别,有英语成绩,数学成绩,语文成绩;求总分,平均分,以及打印输出学生的相关信息。 # 日 期:2023.4.29 # 思 路:利用类的特性编写相应的函数即可 class Student: def __init__(self, name, age, sex, English_score, Math_score, Chinese_score): self.name = name self.age = age self.sex = sex self.English_score = English_score self.Math_score = Math_score self.Chinese_score = Chinese_score # 计算总分 def total_score(self): sum_ = self.English_score + self.Math_score + self.Chinese_score print("总分为:",sum_) # 计算平均成绩 def average_score(self): sum_ = self.English_score + self.Math_score + self.Chinese_score ave = sum_/3 print("平均成绩为:", ave) # 输出学生信息 def show(self): print("学生的姓名为:", self.name) print("学生的年龄为:", self.age) print("学生的性别为:", self.sex) print(f"学生的英语成绩为:{self.English_score}, 学生的数学成绩为:{self.Math_score}, 学生的语文成绩为:{self.Chinese_score}") stu1 = Student("张三", 19, "male", 88, 90,91) stu1.show() stu1.total_score() stu1.average_score()
-
设计一个Person类,属性有姓名、年龄、性别,创建方法personInfo,打印输出这个人的信息;创建Student类,继承Person类,属性有学院college,班级Group,重写父类PersonInfo方法,调用父类方法打印输出个人信息,将学生的学院、班级信息也打印输出出来。
代码块:
# 程序名:test5.4 # 设计一个Person类,属性有姓名、年龄、性别,创建方法personInfo,打印输出这个人的信息;创建Student类,继承Person类,属性有学院college,班级Group,重写父类PersonInfo方法,调用父类方法打印输出个人信息,将学生的学院、班级信息也打印输出出来。 # 日 期:2023.4.29 # 思 路:利用类的特性编写相应的函数,再利用super()函数调用父类方法即可。 class Person: def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex # 父类的personInfo()函数 def personInfo(self): print("姓名为:", self.name) print("年龄为:", self.age) print("性别为:", self.sex) class Student(Person): def __init__(self, name = '', age = 19, sex = 'male', collage = "", group = ""): # 利用super()函数调用父类方法 super(Student, self).__init__(name, age, sex) self.collage = collage self.group = group # 重写父类personInfo()函数 def personInfo(self): # 利用super()函数调用父类方法输出信息 super(Student, self).personInfo() print("学生的学院为:", self.collage) print("学生的班级为:", self.group) stu = Student("xx", 19, "male", "software", "22-6") stu.personInfo()
-
定义一个交通工具(Vehicle)的类,属性:速度(speed)、体积(size)等等。方法:移动move()、设置速度setSpeed(int speed)、加速speedUp()、减速speedDown()等等。实例化一个交通工具对象,通过方法初始化speed、size的值并且在相关方法中可以打印输出出来;另外调用加速减速的方法对速度进行改变。
代码块:
# 程序名:test5.5 # 定义一个交通工具(Vehicle)的类,属性:速度(speed)、体积(size)等等。方法:移动move()、设置速度setSpeed(int speed)、加速speedUp()、减速speedDown()等等。实例化一个交通工具对象,通过方法初始化speed、size的值并且在相关方法中可以打印输出出来;另外调用加速减速的方法对速度进行改变。 # 日 期:2023.4.29 # 思 路:利用类的特性编写相应的函数即可。 class Vehicle: def __init__(self, spend, size): self.spend = spend self.size = size def move(self): print(f"交通工具开始以{self.spend}m/s向前移动") def setSpend(self, spend_): self.spend = spend_ def spendUp(self, increase): self.spend += increase print("速度增加后为:%d m/s" % self.spend) def spendDown(self, drop): self.spend -= drop print("速度增加后为:%d m/s" % self.spend) def show(self): print("该交通工具的当前的速度为:%d m/s" % self.spend) print("该交通工具的体积为:%d m^2" % self.size) car = Vehicle(20,100) car.move() car.show() x1 = int(input("请输入上升速度的变化量:")) car.spendUp(x1) car.show() x2 = int(input("请输入下降速度的变化量:")) car.spendDown(x2) car.show()
五、实验小结
(包括问题和解决办法、心得体会、意见与建议等)
问题和解决方法:
-
问题一:在访问类中的方法时,方法传递参数出现错误。
解决方法:通过查询资料得知,方法需要传递self参数,传递后才能正常访问,更改后,程序正常运行。 -
问题二:在利用super()函数访问父类方法时,传递参数同样出现问题。
解决方法:查询资料后,可以在super()里面先传一个子类的类名,再传一个子类的实例对象,也可以不传参,但是这种方法容易在多继承时出现问题。 -
问题三:在动态增加类方法时出现问题。
解决方法:通过查询资料后得知,增加的方法不是具体类的方法,要是普通方法,更改后,程序正常运行。
心得体会:
-
方法是特殊的函数,在调用类中的方法时,是对象的引用,其中私有方法不能通过对象名直接调用。
-
在多继承中,如果多个父类中有相同名字的成员,且在子类中使用该成员时没有指定其所属父类,则会按照从左向右进行搜索。
。 -
问题二:在利用super()函数访问父类方法时,传递参数同样出现问题。
解决方法:查询资料后,可以在super()里面先传一个子类的类名,再传一个子类的实例对象,也可以不传参,但是这种方法容易在多继承时出现问题。 -
问题三:在动态增加类方法时出现问题。
解决方法:通过查询资料后得知,增加的方法不是具体类的方法,要是普通方法,更改后,程序正常运行。
心得体会:
- 方法是特殊的函数,在调用类中的方法时,是对象的引用,其中私有方法不能通过对象名直接调用。
- 在多继承中,如果多个父类中有相同名字的成员,且在子类中使用该成员时没有指定其所属父类,则会按照从左向右进行搜索。
- python中带下划线的变量名和方法名具有特殊含义,尤其是在类的定义中,用下划线作为变量名和方法名前缀和后缀来表示类的特殊成员。