Python编程作业五:面向对象编程

简介: Python编程作业五:面向对象编程



一、类的定义和方法

       定义一个学生类(Student),包括学号(id)、姓名(name)、出生日期(birthday)和分数(score)4个属性,其中出生日期是私有属性,不能被外界直接访问。该类应具有返回学生学号、姓名、年龄和分数的方法(可以考虑定义一个__str__方法,当然也可以是其他名称的方法),还应该具有使用小于号(<)对两个学生的分数比较大小的方法,以及使用等于号(=)判断两个同学是否出生在同一天的方法(建议考虑定义__lt__和__eq__实现运算符重载)。请编写该类并对其进行测试,程序测试的结果如下图所示:

class Student:
    def __init__(self, sno, name, birthday, score):
        self.no = sno
        self.name = name
        self.__birthday = birthday  # 私有属性
        self.score = score
 
    def __str__(self):
        return '\n学号:' + self.no + '\n姓名:' + self.name + '\n生日:' + self.__birthday + '\n成绩:' + str(self.score)
 
    def __lt__(self, other):
        if self.score < other.score:
            return True
        else:
            return False
 
    def __eq__(self, other):
        if self.__birthday == other.__birthday:
            return True
        else:
            return False
 
stud1 = Student('1001', '李刚', '1999-06-19', 89)
print(stud1)
stud2 = Student('1002', '王强', '2001-03-5', 79)
print(stud2)
stud3 = Student('1002', '张勇', '2001-03-5', 93)
print(stud3)
 
def compare_score(s1, s2):
    if s1 < s2:
        print(s1.name, '的成绩低于', s2.name, sep='')
    else:
        print(s1.name, '的成绩不低于', s2.name, sep='')
 
def compare_birthday(s1, s2):
    if s1 == s2:
        print(s1.name, '与', s2.name, '是同一天出生', sep='')
    else:
        print(s1.name, '与', s2.name, '不是同一天出生', sep='')
 
print()
compare_score(stud1, stud2)
compare_birthday(stud1, stud2)
compare_score(stud2, stud3)
compare_birthday(stud2, stud3)

       这段代码定义了一个名为 "Student" 的类,表示学生对象。该类具有以下属性和方法:

属性:

  • no:学号
  • name:姓名
  • __birthday:生日(私有属性)
  • score:成绩

方法:

  • __init__(self, sno, name, birthday, score):构造函数,用于初始化学生对象的属性。
  • __str__(self):返回一个包含学生信息的字符串,包括学号、姓名、生日和成绩。
  • __lt__(self, other):比较运算符重载方法,用于比较两个学生对象的成绩大小。
  • __eq__(self, other):比较运算符重载方法,用于比较两个学生对象的生日是否相等。

       然后,代码创建了三个学生对象(stud1、stud2和stud3),并使用构造函数进行初始化。随后,调用print函数打印每个学生对象的信息。

       接着,代码定义了两个函数:

  • compare_score(s1, s2):比较两个学生对象的成绩,并输出结果。
  • compare_birthday(s1, s2):比较两个学生对象的生日,并输出结果。

       最后,调用这两个函数来比较学生对象之间的成绩和生日关系,然后输出相应的结果。

运行结果:

二、图书管理系统

       在图书管理系统中,读者类(Reader)是一个父类,该类包括读者编号(rid)、姓名(name)、所在部门(dept)3个公有的实例属性,以及读者人数(counts)1个私有的类属性。读者的编号(rid)要求能够根据的创建的读者数而自动编号。读者类应具有输出读者公开属性的__str__方法,还应具有创建和注销读者、以及返回读者人数的方法。


       教师读者类(TeaReader)是读者类(Reader)的一个子类,它除了继承父类的公有属性外,还具有教师读者最大借阅数(max_borrow)和教师读者数(tNums)2个公有的类属性。要求设置教师读者最大借阅数(max_borrow)的初值为20,而教师读者的编号(rid)均以字母t开头,并且会根据的创建的教师读者数而自动编号。


       学生读者类(TeaReader)是读者类(Reader)的一个子类,它除了继承父类的公有属性外,还具有学生读者最大借阅数(max_borrow) 和学生读者数(sNums)2个公有的类属性。要求设置学生读者最大借阅数(max_borrow)的初值为10,而学生读者的编号(rid)均以字母s开头,并且会根据的创建的学生读者数而自动编号。


       请根据下图的运行结果设计满足上述要求的三个类。

class Reader:
    __counts=0    #私有类变量
    def __init__(self, name, dept):
        Reader.__counts+=1
        self.rid=str(Reader.__counts)
        self.name=name
        self.dept=dept
        print('你是第{}位读者'.format(Reader.__counts))
 
    def __str__(self):
        return "读者的信息---编号:"+self.rid+",姓名:"+self.name+",所在部门:"+self.dept
 
    def logout(self):
        if Reader.__counts>0:
            Reader.__counts-=1
 
    @classmethod
    def reader_count(cls):
        return cls.__counts
 
class TeaReader(Reader):
    tNum=0
    max_borrow=20
    def __init__(self,name,dept):
        super().__init__(name,dept)
        TeaReader.tNum+=1
        self.rid='t'+str(TeaReader.tNum)
        print(self)
 
    def __str__(self):
        return super().__str__()
 
    def logout(self):
        super().logout()
        if TeaReader.tNum>0:
            TeaReader.tNum-=1
            print("注销教师读者:"+self.rid)
 
    @classmethod
    def get_max_borrow(cls):
        return cls.max_borrow
 
class StuReader(Reader):
    sNum=0
    max_borrow=10
    def __init__(self,name,dept):
        super().__init__(name,dept)
        StuReader.sNum+=1
        self.rid='s'+str(StuReader.sNum)
        print(self)
 
    def __str__(self):
        return super().__str__()
 
    def logout(self):
        super().logout()
        if StuReader.sNum>0:
            StuReader.sNum-=1
            print("注销学生读者:"+self.rid)
 
    @classmethod
    def get_max_borrow(cls):
        return cls.max_borrow
 
t1=TeaReader('张辉','中文')
t2=TeaReader("李想",'英语')
s1=StuReader('张三','机械')
s2=StuReader('赵六','海洋')
print("教师读者最大借阅数:{}".format(TeaReader.get_max_borrow()))
print("学生读者最大借阅数:{}".format(StuReader.get_max_borrow()))
print("当前读者总人数:{}".format(Reader.reader_count()))
s2.logout()
print("当前教师读者总人数:{}".format(TeaReader.tNum))
print("当前学生读者总人数:{}".format(StuReader.sNum))
print("当前读者总人数:{}".format(Reader.reader_count()))

       这段代码定义了三个类:Reader(读者)、TeaReader(教师读者)和 StuReader(学生读者)。通过这些类,可以管理不同类型的读者,并跟踪他们的数量以及最大借阅数。

在代码中,使用了类变量、实例变量、类方法和实例方法来实现不同功能。主要有以下几点:

  • Reader 类包含一个私有类变量 __counts 用于统计读者的数量,通过 __init__ 方法初始化读者的信息,并提供 logout 方法注销读者,以及 reader_count 类方法获取读者总人数。
  • TeaReader 和 StuReader 类继承自 Reader 类,分别表示教师读者和学生读者,重写了部分方法以适应特定需求,比如修改读者编号规则、增加最大借阅数等。
  • 在主程序中创建了几个教师读者和学生读者对象,演示了不同方法的调用和读者信息的管理。运行结果:


目录
相关文章
|
1天前
|
开发者 Python
GitHub飙升!京东认证的“Python编程入门三剑客”究竟好在哪?
Python凭借着简单易学、功能强大,已经跃居TIOB编程语言榜首,并且已经开始了它的霸榜之旅。如何选择一套适合自己的Python学习教程,是每个Python爱好者面临的首要问题。
|
2天前
|
存储 设计模式 算法
Python基础教程(第3版)中文版 第19章 趣味编程 (笔记)
Python基础教程(第3版)中文版 第19章 趣味编程 (笔记)
|
2天前
|
Shell Python
GitHub星标破千Star!Python游戏编程的初学者指南
Python 是一种高级程序设计语言,因其简洁、易读及可扩展性日渐成为程序设计领域备受推崇的语言。 目前的编程书籍大多分为两种类型。第一种,与其说是教编程的书,倒不如说是在教“游戏制作软件”,或教授使用一种呆板的语言,使得编程“简单”到不再是编程。而第二种,它们就像是教数学课一样教编程:所有的原理和概念都以小的应用程序的方式呈现给读者。
|
3天前
|
机器学习/深度学习 存储 自然语言处理
惊艳!老司机熬夜总结的Python高性能编程,高效、稳定、快速!
Python 语言是一种脚本语言,其应用领域非常广泛,包括数据分析、自然语言处理机器学习、科学计算、推荐系统构建等。 能够轻松实现和代码跑得够快之间的取舍却是一个世人皆知且令人惋惜的现象而这个问题其实是可以解决的。 有些人想要让顺序执行的过程跑得更快。有些人需要利用多核架构、集群,或者图形处理单元的优势来解决他们的问题。有些人需要可伸缩系统在保证可靠性的前提下酌情或根据资金多少处理更多或更少的工作。有些人意识到他们的编程技巧,通常是来自其他语言,可能不如别人的自然。
|
3天前
|
机器学习/深度学习 人工智能 算法
|
3天前
|
Python
别再被Python的面向对象编程绕晕了!一篇文章带你理清思路!
【6月更文挑战第12天】了解Python的面向对象编程(OOP)至关重要,它基于“万物皆对象”的理念,通过类(Class)定义对象的属性和方法。对象是类的实例,具有状态和行为。OOP包括类、对象、属性和方法四个基本概念。例如,`class Dog`定义了一个有`name`和`age`属性及`bark`方法的类。OOP提供代码重用、模块化、可扩展性和易理解性等优势,是现代编程的常用范式。通过学习,你可以更好地掌握这一核心技能。
|
3天前
|
Python
Python编程实战:如何将列表组装成一棵树结构
本文介绍了如何在Python中将列表转换为树结构。首先定义`TreeNode`类表示节点,包含值和子节点列表。然后,通过`list_to_tree`函数递归地将列表转为树。此外,还提供了添加和删除节点的方法。文章旨在帮助读者理解和操作树结构,以解决实际编程问题。
Python编程实战:如何将列表组装成一棵树结构
|
4天前
|
网络协议 数据库 Python
Python高级编程:你的代码,为何总是“撩”不到那个TA的心?
【6月更文挑战第11天】Python高级编程重在提升编程思维和方法,包括关注代码的可读性、可维护性和性能。要让代码“撩”到期望的效果,需注意整体架构设计,使用有意义的命名和注释,模块化代码。利用timeit测试性能,借助内置数据类型和算法库优化。示例代码展示了列表推导式和内置函数的高效应用。通过提升这些方面,实现业务需求、性能优化和团队协作的目标。
|
4天前
|
存储 Unix Linux
Python CGI编程
Python CGI编程
|
5天前
|
调度 数据库 开发者
在Python编程中,并发编程和异步IO是两个重要的概念,它们对于提高程序性能和响应速度具有至关重要的作用
【6月更文挑战第10天】本文介绍了Python并发编程和异步IO,包括并发编程的基本概念如多线程、多进程和协程。线程和进程可通过threading及multiprocessing模块管理,但多线程受限于GIL。协程利用asyncio模块实现非阻塞IO,适合处理IO密集型任务。异步IO基于事件循环,能提高服务器并发处理能力,适用于网络编程和文件操作等场景。异步IO与多线程、多进程在不同任务中有各自优势,开发者应根据需求选择合适的技术。
18 0