当前位置: 首页 > backend >正文

Python 面向对象练习

  不多bb了,直接上代码吧。

from pprint import pprint
class Course:total_course = []def __init__(self,name,id):self.name = nameself.id = idself.is_select = FalseCourse.total_course.append(self)def __repr__(self):return (f"{__class__.__name__}("f"学科:{self.name!r},学科代码:{self.id!r})")class Students:total_students = []def __init__(self):self.selected_courses = []# Students.total_students.pop()def register(self,name,id,institution,classes,password):self.name = nameself.id = id self.institution = institutionself.classes = classesself.password = passwordStudents.total_students.append(self)def log_in(self,student_id,student_password):for i in Students.total_students:if student_id == i.id and student_password == i.password:return Truereturn Falsedef select_course(self,course):for i in Course.total_course:if i.name == course:i.is_select = Trueself.selected_courses.append((i.name,i.id))return Truereturn Falsedef withdraw_a_course(self,course):for i in range(len(self.selected_courses)):if self.selected_courses[i][0] == course:self.selected_courses.pop(0)return Truereturn Falsedef get_name_through_id(self,id):for i in Students.total_students:if i.id == id:return i.namedef get_info_through_name(self,name):for i in Students.total_students:if i == None:continueelif i.name == name:return idef __repr__(self):return (f"{__class__.__name__}("f"{self.name!r},{self.id!r},{self.institution!r},{self.classes!r},{self.password!r})")
Course.total_course.extend([Course("Python","25234"),Course("高等数学","23123"),Course("线性代数","23145"),Course("数字逻辑","89080"),Course("算法设计与分析","237234"),Course("物理","2358239"),Course("生物","43598734"),Course("化学","233521"),Course("计算机网络","45234324")
])
Students.total_students.extend([Students().register("Jace","2432","马克思主义学院","12","1234125"),Students().register("Curry","2352525","计算机学院","13","124125")
])# info = list(input("请输入所有相关个人信息(姓名,学号,学院,班级,密码):").split())
# Students().register(*info)
# print("您已注册成功并成功登录!")
# # course = input("请输入选课名称:").strip()
# # info = Students().get_info_through_name("Jace")
# # if info.select_course(course):
# #     print("选课成功!")
# pprint(Students.total_students)student_name = ""
info = ""
is_log_in = False
while True:if is_log_in == False:print("欢迎使用选课系统!")print("1. 注册学生")print("2. 登录")print("3. 选课")print("4. 退课")print("5. 查看已选课程")print("6. 查看所有课程")print("7. 退出系统")print("8. 终止程序")print("如果您未注册,请输入1注册")# 假定学生操作无误print("如果您已注册,请输入2登录")print("如果已经登陆,请输入对应序号来进行其他操作")x = int(input())if x == 1:# 假定输入无误info = list(input("请输入所有相关个人信息(姓名,学号,学院,班级,密码):").split())Students().register(*info)print("您已注册成功并成功登录!")is_log_in = Truestudent_name = info[0]elif x == 2:info = list(input("请输入学号和密码.").split())if Students().log_in(*info):print("成功登录")is_log_in = Truestudent_name = Students().get_name_through_id(info[0])else:print("学号或密码不正确,请再尝试一下.")elif x == 3:course = input("请输入选课名称:").strip()info = Students().get_info_through_name(student_name)if info.select_course(course):print("选课成功!")else:print("没有该课程.")elif x == 4:course = input("请输入退课名称:").strip()info = Students().get_info_through_name(student_name)if info.withdraw_a_course(course):print("退课成功")else:print("没有该退课课程")elif x == 5:info = Students().get_info_through_name(student_name)if info.selected_courses == []:print("您未选课")else:print(f"您学课程如下:{info.selected_courses}")elif x == 6:print("所有科目显示如下:")pprint(Course.total_course)elif x == 7:print("您已退出")student_name = ""info = ""is_log_in = Falsecontinueelif x == 8:break

  一个小题目,本来使用列表+字典实现的,我看了想了想,还是通过面向对象来做做吧,提高一下能力。整个代码测试下来的时候就是在Students中的类变量列表total_students,在我一开始通过两个register初始化的时候,总会出现多余的两个None,不知道为啥,以及为何出现,并且在选课模块出现了问题,我自己看了看,改了.get_info_through_name的内部逻辑,如果为None的话直接continue,这样能解决问题,但是并没有根本解决问题。
  最近看了manim大佬的源代码,确实能学到很多东西,对面向对象又够了更深层次的认识。如果缺少这一认识,这个题目虽然也能用面向对象思想来做,然理解程度肯定不够。当然,现在肯定也是不够的,还需要多多摸索。manim中的类、方法,肯定是因为为了解决实际情况而产生的,对于制作它们的作者来说,理解起来很容易,但是开源让别人学的话,不明白其切实含义,缺少实践,就是很难理解。比如在我的Students类中有这两个方法:

def get_name_through_id(self,id):for i in Students.total_students:if i.id == id:return i.name
def get_info_through_name(self,name):for i in Students.total_students:if i == None:continueelif i.name == name:return i

  别人来看肯定不理解什么意思以及为什么有这两个方法,但是确实是我自己在解决问题时必要的,第一个方法是通过id找到name,即由学号找到姓名。登录时是输入学号+密码登录,通过学号找到姓名,进而在进行一些列的操作。第二个方法是通过姓名找到所有个人信息,看名字就知道啥意思了,我也不多说了。这都是有其存在的意义的。
  还是要感谢那个manim大佬,让我对抽象类有了额外的理解。无法用言语说明,只能自个去悟。

http://www.xdnf.cn/news/1594.html

相关文章:

  • 探秘 FFmpeg 版本发展时间简史
  • SpringMVC处理请求映射路径和接收参数
  • 配置RSUniVLM环境(自用)
  • [特殊字符] 分布式定时任务调度实战:XXL-JOB工作原理与路由策略详解
  • IDEA启动报错Failed to create JVM. JVM path的解决办法
  • (51单片机)LCD展示动画(延时函数)(LLCD1602教程)
  • 2025最新系统 Linux 教程(六)
  • Puter部署指南:基于Docker的多功能个人云平台掌控自己的数据
  • uniapp-商城-34-shop 购物车 选好了 进行订单确认
  • java—12 kafka
  • Kubernetes(K8S)入门阶段详细指南
  • 微信小程序根据图片生成背景颜色有效果图
  • 并发设计模式实战系列(6):读写锁
  • 【UVM项目实战】异步fifo—uvm项目结构以及uvm环境搭建
  • 开源交易所源码,交易所开发
  • 11.原型模式:思考与解读
  • 使用eclipse将原有tomcat插件工程调整为的Dynamic Web Module工程(保姆级教程)
  • 【数据可视化-26】基于人口统计与社会经济数据的多维度可视化分析
  • 【LLM+Code】Windsurf Agent 模式PromptTools详细解读
  • JAVA---面向对象(上)
  • 5.3.1 MvvmLight以及CommunityToolkit.Mvvm介绍
  • Redis安装及入门应用
  • 第53.5讲 | 小项目实战:用 SHAP 值解释农作物产量预测模型 [特殊字符][特殊字符]
  • SpringBoot整合AOP
  • Tomcat:从零理解Java Web应用的“心脏”
  • 健康养生小窍门
  • 微高压氧舱VS高压氧舱:氧气疗法的“双生花”如何重塑健康?
  • 【前端】基于 Promise 的 HTTP 客户端工具Axios 详解
  • MVCC详解
  • 【前端】【业务场景】【面试】在前端开发中,如何实现文件的上传与下载功能,并且处理可能出现的错误情况?