10. 抽象类

  • 概念:抽象类(Abstract Class) 是一种 不能被直接实例化 的类,通常作为“规范”,让子类去继承并实现其中定义的抽象方法,本身只定义规范,不需要提供完整实现。
  • 例如:动物会叫、飞行器会飞、支付方式会支付。
from abc import ABC, abstractmethod

#【抽象类】是一种不能直接实例化的类,它通常作为“规范”,让子类去继承,并实现其中定义的【抽象方法】。

# MustRun类一旦继承了ABC类,那MustRun类就是【抽象类】了
class MustRun(ABC):
    # run方法一旦被@abstractmethod装饰后,就变成了【抽象方法】
    @abstractmethod
    def run(self):
        pass

class Person(MustRun):
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

    def run(self):
        print(f'我叫{self.name},我在努力的奔跑!')

p1 = Person('张三', 18, '男')
p1.run()

11. 小练习

完成一个学生成绩管理小案例

图片[1]-10. 抽象类-大赛人网

具体代码如下:

from datetime import datetime

# 定义Person类
class Person:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

class Student(Person):
    # 计数器
    count = 0

    def __init__(self, name, age, gender):
        super().__init__(name, age, gender)
        Student.count += 1
        # 给每个学生添加stu_id属性,格式为:年份-序号,序号靠计数器增长。
        self.stu_id = f'{datetime.now().year}{Student.count:03d}'
        # 给学生添加成绩,格式为: {'数学':90, '语文':80, '英语':70}
        self.scores = {}

    # 给当前学生添加成绩
    def add_score(self, subject, score):
        # 给指定学生添加成绩,subject是学科,score是成绩
        self.scores[subject] = score

    # 计算平均分
    def calcu_avg(self):
        if self.scores:
            # 计算平均成绩
            return sum(self.scores.values()) / len(self.scores)
        else:
            return 0

    # 魔法方法
    def __str__(self):
        return f'{self.name}({self.age}-{self.gender}),成绩:{self.scores},平均分:{self.calcu_avg():.1f}'

class Manager:
    def __init__(self):
        self.stu_list = []

    # 添加学生
    def add_student(self):
        name = input('请输入姓名:')
        age = int(input('请输入年龄:'))
        gender = input('请输入性别:')
        # 创建学生实例对象
        stu = Student(name, age, gender)
        # 将当前学生添加到stu_list列表中
        self.stu_list.append(stu)
        print(f'添加成功!学号是:{stu.stu_id}')

    # 删除学生
    def del_student(self):
        sid = input('请输入学号:')
        # target用于保存要删除的学生
        target = None
        # 遍历所有学生,找到要删除的学生,并交给target变量
        for stu in self.stu_list:
            if stu.stu_id == sid:
                target = stu
        # 如果找到了要删除的学生,就调用remove方法移除该学生
        if target:
            self.stu_list.remove(target)
            print('删除成功!')
        # 如果未找到要删除的学生
        else:
            print('学号有误,删除失败!')

    # 展示所有学生
    def show_all_student(self):
        # 如果当前stu_list中有学生,就遍历展示
        if self.stu_list:
            for stu in self.stu_list:
                print(stu)
        # 如果当前stu_list中没有学生,就打印:暂无学生!
        else:
            print('暂无学生!')

    # 给指定学生设置成绩
    def set_score(self):
        sid = input('请输入学号:')
        # 遍历stu_list列表
        for stu in self.stu_list:
            # 如果当前学生学号,与输入的sid相等
            if stu.stu_id == sid:
                # 输入成绩字符串,格式为:学科-分数,学科-分数
                score_str = input('清输入成绩(学科-分数,学科-分数)')
                # 将输入的多个成绩,按照逗号拆分,形成成绩列表
                score_list = score_str.replace(',', ',').split(',')
                # 循环成绩列表,依次添加成绩
                for item in score_list:
                    # 获取科目与成绩
                    subject, score = item.split('-')
                    subject = subject.strip()
                    score = float(score.strip())
                    # 调用add_score方法,添加科目,成绩
                    stu.add_score(subject, score)
                print('添加成功!')
                # 结束循环,同时结束set_score函数
                return
        # 若程序能执行到此处,证明在stu_list中没有找到与sid对应的学生
        print('学号有误!')

    # 提供主菜单
    def run(self):
        while True:
            print('************学生管理************')
            print('1. 添加学生')
            print('2. 删除学生')
            print('3. 查看所有学生')
            print('4. 录入成绩')
            print('5. 退出')

            chocie = input('请输入操作编号:')
            if chocie == '1':
                self.add_student()
            elif chocie == '2':
                self.del_student()
            elif chocie == '3':
                self.show_all_student()
            elif chocie == '4':
                self.set_score()
            elif chocie == '5':
                print('再见!')
                break
            else:
                print('输入有误!')

m1 = Manager()
m1.run()
© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发
头像-大赛人网
欢迎您留下宝贵的见解!
提交
头像-大赛人网

昵称

取消
昵称

    请登录后查看评论内容