实验五 面向对象程序设计

实验五 面向对象程序设计

一、实验学时:2学时

二、实验目的

  1. 掌握:Python类的定义,class关键字,创建对象的方法,访问对象中的成员。
  2. 掌握:私有成员与公有成员,数据成员与成员方法,类方法与静态方法,属性的定义与使用,混入机制
  3. 掌握:继承的作用与Python实现。
  4. 掌握:构造函数 __ init __ (),析构函数__ del __ (),__ dd __ ()、__ mul __ ()、__ pow __ ()及其他Python类特殊方法与运算符的对应关系。

三、实验内容

  1. 有下面的类属性:姓名、年龄、成绩列表[语文,数学,英语],其中每门课成绩的类型为整数,类的方法如下所述:
    (1) 列表项列表项获取学生的姓名。get_name(),返回类型:str。
    (2) 获取学生的年龄。get_age(),返回类型:int。
    (3) 返回3门科目中最高的分数。get_course(), 返回类型:int。
    类定义好之后,可以定义同学测试如下: zm = Student(‘zhangming’,20,[69,88,100]);返回结果: zhangming 20 100
  2. 设计一个Circle(圆)类,包括圆心位置、半径、颜色等属性。编写构造方法和其他方法,计算周长和面积。请编写程序验证Circle(圆)类的功能。
  3. 封装一个学生类,有姓名,有年龄,有性别,有英语成绩,数学成绩,语文成绩;求总分,平均分,以及打印输出学生的相关信息。
  4. 设计一个Person类,属性有姓名、年龄、性别,创建方法personInfo,打印输出这个人的信息;创建Student类,继承Person类,属性有学院college,班级Group,重写父类PersonInfo方法,调用父类方法打印输出个人信息,将学生的学院、班级信息也打印输出出来。
  5. 定义一个交通工具(Vehicle)的类,属性:速度(speed)、体积(size)等等。方法:移动move()、设置速度setSpeed(int speed)、加速speedUp()、减速speedDown()等等。实例化一个交通工具对象,通过方法初始化speed、size的值并且在相关方法中可以打印输出出来;另外调用加速减速的方法对速度进行改变。

四、实验结果

  1. 有下面的类属性:姓名、年龄、成绩列表[语文,数学,英语],其中每门课成绩的类型为整数,类的方法如下所述:
    (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")

运行结果截图:
图片描述

  1. 设计一个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()

运行结果截图:
图片描述

  1. 封装一个学生类,有姓名,有年龄,有性别,有英语成绩,数学成绩,语文成绩;求总分,平均分,以及打印输出学生的相关信息。
    题目思路:
    和第一题非常类似,成绩用列表来存储,求总分可以使用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()

运行结果截图:
图片描述

  1. 设计一个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()

运行结果截图:
图片描述

五、实验小结

问题和解决方法:

  1. 不知道如何设置函数中返回值的类型和参数的类型。
    解决方法:通过查询相关内容得知,类似def get_course(self,course:int) -> int: 这样的写法表示参数course需要输入int类型,而函数的返回类型也是int类型。
  2. 在写类的继承中,写子类的构造函数时报错。
    解决方法:在写子类构造时需要对超类的构造进行调用,并且需要往里面传参数。
  3. 对类中一些特殊方法/魔术方法不熟悉。
    解决方法:通过查询书以及上网查询得到解决。

心得体会:

  1. 在写python类的时候类比C++中的内容,都有构造函数、析构函数等等,Python中类的创建包括类本身和类对象(实例)两部分,类比于C++类中的静态成员变量/方法和类成员变量/方法。在学习python类的过程中,主要是要熟悉类定义时的语法,和各种特殊方法的使用,以及应用条件。感觉到自己写代码的熟练度越来越强了。
  2. 在python定义类的时候需要注意的有:类属性和类方法在内存中只有一份,所有类对象共用一份。 类对象的成员属性是通过(构造函数)进行定义并进行初始化的。类对象的成员方法构建方法和函数构建方法一样。
  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一只大狸子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值