Python程序设计基础 课件 项目七编写基于面向对象的学生成绩管理系统_第1页
Python程序设计基础 课件 项目七编写基于面向对象的学生成绩管理系统_第2页
Python程序设计基础 课件 项目七编写基于面向对象的学生成绩管理系统_第3页
Python程序设计基础 课件 项目七编写基于面向对象的学生成绩管理系统_第4页
Python程序设计基础 课件 项目七编写基于面向对象的学生成绩管理系统_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python程序设计

项目7编写基于面向对象的学生成绩管理系统7.1学习目标

学习基础知识:Python面向对象的程序设计基本思想类中变量和方法的应用构造方法和析构方法的应用面向对象三大特性的基本应用通过学习编写基于面向对象的学生成绩管理系统项目,实现典型管理系统基本操作。7.2基础知识7.2.1面向对象编程简介程序设计有面向过程和面向对象两大类面向对象的编程思想,可以理解为在解决问题时,首先分析需要解决的问题中存在哪些对象,找出其共同的特征(属性)和行为(方法),以类的形式进行描述。具体到解决问题时,是以对象实例为中心来完成。对象是面向对象编程的核心,用来描述一个具体的事物。类是用来描述具有相同特征(属性)和行为(方法)的对象的集合。7.2.1面向对象编程简介程序设计有面向过程和面向对象两大类,其中面向过程的程序设计有PASCAL语言、C语言等;面向对象的程序设计有C++、Java语言,Python语言等。分析问题,把复杂问题逐步分解,变成可以解决的简单问题,每个简单问题可以通过若干步骤来解决,以函数为中心。解决问题时,首先分析需要解决的问题中存在哪些对象,找出其共同的特征(属性)和行为(方法),以类的形式进行描述,以对象实例为中心。面向过程编程思想面向对象编程思想7.2.2类与对象的创建类与对象的概念在面向对象编程中,最重要的两个概念就是类和对象。类是对象的抽象,是对共同拥有的特征(属性)和行为(方法)的集合的统称。如学生,都拥有“学号”、“姓名”等特征,以及“选课”、“考试”等行为;对象是类的实例,一个类可以有多个对象。

类的创建

定义类的基本语法格式如下:

类体由类属性、成员和方法组成。class

类名:

类体7.2.2

类与对象的创建例:下面定义了一个学生类

需要注意是,使用属性命名区分公有属性和私有属性,其中私有属性以两个下划线开头,不能在类外面被访问。上述学生类中,name为公有属性,可以直接在类外面进行访问,而__age是私有属性,不能在类外面被访问。classStudent: name='张山'

#定义name属性_

_age=18

#定义_

_age属性deftell(self):

#定义tell方法print('我的名字叫张山')7.2.2

类与对象的创建对象的创建程序要实现具体的功能,需要在类的基础上创建类的对象(也称为实例化对象)。在Python中,创建类的对象语法格式如下:创建了类的对象之后,访问类的属性和方法格式如下:

对象名.属性名对象名.方法名(参数)对象名=类名()7.2.2

类与对象的使用例:练习类与对象的使用。

一个类可以创建若干个对象,当一个对象的方法被调用时,Python解释器会把这个对象作为第一个参数传递给self,应用程序只需要传递后面的参数即可。classCar: defcolor(self,col): #定义赋值颜色方法self.col=col #赋值defshow(self):

#定义显示颜色方法

print('汽车的颜色是:%s.'%self.col)

#输出颜色car1=Car() #创建对象car1car1.color('red')

#调用方法car2=Car()

#创建对象car2car2.color('white') #调用方法car1.show() #调用方法car2.show() #调用方法程序运行结果:汽车的颜色是:red汽车的颜色是:white7.2.2类与对象的使用构造方法与析构方法概念解析:构造方法是一种特殊方法,其名称固定为__init__()。当创建类的对象时,系统会自动调用该方法,其目的是对对象进行初始化操作。析构方法名称为__del__()。当需要删除一个对象或程序结束时会自动调用该方法删除对象,完成释放资源的操作。构造方法析构方法7.2.2类与对象的使用例:练习实例成员在构造方法和析构方法中应用。

classStu: def__init__(self,grade,age):self.grade=grade#定义grade属性并赋值self.age=age#定义age属性并赋值deftell(self):#定义tell方法print('年级:{},年龄:{}'.format(self.grade,self.age))def__del__(self):print("资源已释放")stu1=Stu(1,18)stu1.tell()delstu1print('程序结束')程序运行结果:年级:1,年龄:18资源已释放程序结束7.2.3类成员与实例成员类中定义的变量又称为数据成员。数据成员分为两种:一种是类成员(类属性),另一种是实例成员(实例属性)。在类的方法中可以调用类成员和实例成员。类成员是在类中所有方法之外定义的数据成员,类成员属于类,可以通过类名或对象名访问。实例成员在构造函数__init__()中定义,定义和使用时必须以self作为前缀;实例成员属于实例(即对象),在程序构造函数之外其它位置使用时只能通过对象名访问。类成员实例成员7.2.3类成员与实例成员例:练习使用类成员和实例成员。classStu: grade=2 #类成员def__init__(self,name):=name

#实例成员stu1=Stu('张山')

#创建对象stu1.grade=1#对象修改类成员属性值print(stu1.grade,Stu.grade,)#访问类成员和实例成员Stu.age=18 #增加类成员stu1.major='软件技术'

#增加实例成员print(stu1.major,Stu.age)

#访问类成员和实例成员程序运行结果:1

2张山软件技术

187.2.4类的继承继承是用来实现代码复用和设计复用的机制。Python支持单重继承和多重继承,在继承关系中,已有的、设计好的类称为父类或基类,新设计的类称为子类或派生类。派生类可以继承父类的公有成员,但是不能继承其私有成员。

继承的两种类型:子类只有一个父类,它可以继承父类的所有公有成员和公有方法,但不能继承其私有成员和私有方法。其语法格式如下:class子类名(父类名):子类可以有多个父类,它继承了多个父类的特性。多继承可以看作是对单继承的扩展,其语法格式如下:class子类名(父类名1,父类名2…):单重继承多重继承7.2.4类的继承例:练习单重继承。

classPerson:def__init__(self,name,sex,age):self.p_name=nameself.p_sex=sexself.p_age=agedefshow(self):print(self.p_name,self.p_sex,self.p_age,end="\n")7.2.4类的继承

classStudent(Person):def__init__(self,name,sex,age,mclass,major):Person.__init__(self,name,sex,age)self.p_class=mclassself.p_major=majordefshow(self):Person.show(self)print(self.p_class,self.p_major)s=Student("张山","M",20,"ClassA","Computer")s.show()程序运行结果:张山M20ClassAComputer7.2.4类的继承例:练习多重继承。

#定义打印机类classPrinter:defprintp(self):print('打印功能在使用')#定义扫描仪类classScanner:defprints(self):print('扫描功能在使用')#定义子类AllInOne继承自Printer和ScannerclassAllInOne(Scanner,Printer):defprintsp(self):print('一体机在工作中')aio=AllInOne()

#创建对象aio.printp()

aio.prints()

aio.printsp()

程序运行结果:打印功能在使用扫描功能在使用一体机在工作中7.2.4类的继承子类与父类同名方法的重写与调用在继承关系中,子类会自动继承父类中定义的方法,但如果父类中的方法功能不能满足需求,就可以在子类中重写父类的方法。即子类中的方法会覆盖父类中同名的方法,这称为重载。可使用内置函数super()或“父类名.方法名()”实现在子类中调用父类的方法。7.2.4类的继承例:练习子类与父类同名方法的重写与调用。

定义一个Father类,类中的__init__()方法中设置了name属性。再定义一个继承Fahter类的子类Child,在该类中重写了__init__()方法,其中使用了super()函数调用父类的构造方法,并添加了age属性,因此,Child类既有自定义属性age,又有来自父类的属性name。7.2.4类的继承

classFather: #定义父类def__init__(self,name):=namedeftell(self):print('此处调用父类方法')classChild(Father): #定义子类def__init__(self,name,age):super().__init__(name) #调用父类中的__init__方法self.age=ageprint(name,age)deftell(self):print('子类方法中')print('name:{},age:{}'.format(,self.age))child=Child('张山',20) #创建对象实例child.tell()程序运行结果:张山20子类方法中name:张山,age:207.2.5

类的封装封装隐藏了属性和方法实现的细节,把客观事物封装成抽象的类,并规定类的数据成员和方法只能让可信的类或对象操作。封装可分为两个层面:创建类和对象时,分别创建两者的名称,通过类名或者对象名加“.”的方式访问内部的成员和方法。通过在数据成员(或称之为属性)或方法名前加两个下划线,将其私有化,这样隐藏起来以后,只能在类的内部使用,在类的外部无法访问。第一层面第二层面7.2.5

类的封装例:练习类的私有化成员和方法。

classStu:def__init__(self):self.grade=1self.__age=18def__tellAge(self):print(self.__age)

stu1=Stu()print('stu1.grade=',stu1.grade)print('stu1.__age=',stu1.__age)stu1.__tellAge()程序运行结果:stu1.grade=1Traceback(mostrecentcalllast):File"D:\sample\chapter6\pyexec.py",line11,in<module>print('stu1.__age=',stu1.__age)AttributeError:'Stu'objecthasnoattribute'__age'7.2.5

类的封装上述代码可以正常执行普通的方法,输出普通的数据成员,但在输出stu1.__age时出错,出错原因在于__age是私有属性,而在类的外部无法访问类的私有属性。同样道理,如果程序在执行“stu1.

__tellAge()”语句时,也会有类似的错误信息。对于这类封装问题,可以通过在类中定义一个普通方法(也称之为接口函数),在类的内部访问被隐藏的属性和方法,然后外部可以通过接口函数进行访问。上述例题修改如下。

7.2.5

类的封装创建了类的对象之后,访问类的属性和方法格式如下:

classStu:def__init__(self):self.grade=1self.__age=18def__tellAge(self):returnself.__agedeftell(self): #定义接口函数print('年级:{},年龄:{}'.format(self.grade,self.__tellAge()))#类内部访问私有方法stu1=Stu()stu1.tell()程序运行结果:年级:1,年龄:187.2.6

类的多态多态,顾名思义,指能够呈现出多种不同的形态。Pyhon很多语法都是支持多态,比如返回长度的len()函数,当传入的是字符串时,返回的是字符串的长度;当传入的是列表时,就返回列表长度;当传入的是元组时,就返回元组的长度。

在面向对象编程中,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了实现代码重用。而多态则是为了实现另一个目的,即接口重用。7.2.6

类的多态例:练习多态。

classShape:def__init__(self,name):=namedefdraw_pic(self):print('现在正在画:{}'.format())classRectangle(Shape):#画矩形def__init__(self,name,a,b):super().__init__(name)self.a=aself.b=bdefdraw_pic(self):print('现在正在画:{},长:{},宽:{}'.format(,self.a,self.b))Part2类的多态

classTriangle(Shape):#画三角形def__init__(self,name,a,b,c):super().__init__(name)self.a=aself.b=bself.c=cdefdraw_pic(self):print('现在正在画:{},边长:{},{},{}'.format(,self.a,self.b,self.c))defdraw(x):

#定义函数接收对象x.draw_pic()r=Rectangle('矩形',1,2)t=Triangle('三角形',3,4,5)draw(r)draw(t)程序运行结果:现在正在画:矩形,长:1,宽:2现在正在画:三角形,边长:3,4,57.2.7

类方法和静态方法前面所学的所有实例方法均有一个必须排放在第一位置的self参数,并通过创建后的对象名进行调用。Python中,还有两类常用类的方法,即类方法和静态方法。类方法是类拥有的方法,需要使用修饰器“@classmethod”进行标识。对于类方法,第一个参数必须是类对象,一般是cls而不是使用self。类方法可以通过对象名进行调用,也可以通过类名进行调用。静态方法在类成员方法前使用装饰器@staticmethod修饰。静态方法可以不带任何参数,并且静态方法使用时无法访问实例变量。调用时,既可通过对象名调用,也可以通过类名调用。类方法静态方法7.2.7

类方法和静态方法例:练习类方法。

classMyclass:@classmethoddefclassMethod(cls):print('调用了类方法')m=Myclass()Myclass.classMethod()#类名.方法名调用类方法m.classMethod()

#对象名.方法名调用类方法程序运行结果:调用了类方法调用了类方法7.2.7

类方法和静态方法例:练习静态方法。

classMyclass:@staticmethoddefstaticMethod():print('调用了静态方法')m=Myclass()Myclass.staticMethod()#类名.方法名调用静态方法m.staticMethod()#对象名.方法名调用静态方法程序运行结果:调用了静态方法调用了静态方法7.3典型工作项目本阶段是在Python的IDLE开发环境下,通过使用面向对象技术,编写“学生成绩管理系统”程序,实现基于面向对象的成绩管理系统。通过测试后,提交该程序。

7.3典型工作项目班级同学分组(4-5人一组)在Python的IDLE开发环境下,通过使用面向对象技术,编写基于面向对象的成绩管理系统,通过测试后,提交该程序。

1)添加学生成绩:录入学生成绩信息,写入文件。2)查找学生:按照学号读出指定学生成绩信息。3)排序:按照英语成绩排序所有学生信息。4)浏览:显示所有学生信息。5)删除:删除指定学生成绩信息,更新文件。6)保存:保存所有写入学生信息并写入文件。7)退出:退出系统,不能选择功能菜单选项进行操作。思政元素:让所有同学身体力行地体验把一个大的复杂问题层层转化为一个个小的简单问题来解决的科学思维,体会“简单与复杂”、“整体与局部”的辩证关系,并以此为基石,理解“分工合作”的重要意义,思考个人在团队中特点、责任和提升方向,以认真求实的科学态度在认知–实践–反思–改进的循环中完成团队和个人的共同成长,培养团队沟通互助的核心能力。7.3.1需求分析1.系统需求面对大量的学生信息,借助计算机技术,开发一个拥有基本功能的学生成绩管理系统以提高学生成绩管理工作的效率。通过成绩管理系统,可以对学生成绩信息进行规范管理、科学统计和快速查询,从而减少管理工作量。有效地管理学生成绩相关信息就是学生成绩管理系统要完成的功能。7.3.1需求分析2.功能需求学生成绩管理系统主要目的是要提高学生成绩管理工作的效率,可以对学生个人成绩信息进行管理和维护。本系统的基本功能包括:学生成绩信息的浏览、查询、排序、添加、删除、修改、保存和退出。本系统的学生成绩数据存储在文件中。7.3.1需求分析3.性能需求本系统在Windows平台下运行,系统对运行环境要求是安装并运行了Windows7或windows10的电脑,并安装和配置了Python3.6或更高版本。7.3.2程序设计1.总体设计通过需求分析可以知道,系统的设计一个主界面,通过选择录入、删除、修改、查询、显示选项来实现相应的功能。系统的功能模块包括:(1)添加学生成绩模块:录入学生成绩信息,写入文件。(2)查找学生模块:按照学号读出指定学生成绩信息。(3)排序模块:按照英语成绩排序所有学生信息。(4)浏览模块:显示所有学生信息。(5)删除模块:删除指定学生成绩信息,更新文件。(6)保存模块:保存所有写入学生信息并写入文件。(7)退出模块:退出系统,不能选择功能菜单选项进行操作。7.3.2程序设计2.数据文件设计所有学生成绩信息均写入文本文件,学生成绩信息包括:学号(sno),姓名(name),数学成绩(math),英语成绩(english)。拟采用类的成员变量形式保存数据,如学号为20241234,姓名为张山,数学成绩、英语成绩分别是92和96,学号为20241231,姓名为李海,数学成绩、英语成绩分别是98和97。7.2.2程序设计3.主界面设计界面使用简单直观的布局。主要是实现对功能模块的调用和显示,可以设计为菜单样式。系统主界面如图所示。

7.2.2程序设计4.详细设计(1)添加学生成绩信息模块add_student(self,student)功能:进入系统主界面后,选择1,进入“添加学生成绩”模块,可以按照提示输入相应信息。正确输入完毕后再提示是否继续添加。输入:学号、姓名、数学成绩、英语成绩。处理:按提示格式输入学号,学号、姓名为空均退出返回到主界面,成绩输入不正确回到输入学号。各项参数成功输入后,将输入的学生信息添加到列表中,将列表写入文本文件。输出:正确录入后,提示是否继续添加,不再添加后,提示信息录入完毕。7.2.2程序设计4.详细设计(2)按学号查找学生模块find_student(self,sno)功能:在主界面选择2,进入“按学号查找学生”模块,可以通过学号查找相应信息并显示。输入:根据提示输入需要查找的学号。处理:提示继续输入的学号,打开文件,查询是否存在相对应信息,如果存在,将找到的学生信息保存到列表中,调用显示信息模块。输出:通过显示函数完成输出,判断列表中是否有数据,如果没有,提示“无此学号的学生!”;如果有,则按格式输出包括“学号”,“姓名”,“数学成绩”,“英语成绩”的数据信息。7.2.2程序设计4.详细设计(3)按英语成绩排序模块sort_by_english(self,reverse)和show_student(self)功能:在主界面选择3,进入“按英语成绩排序”模块,打开文件,读出所有学生成绩信息并显示。输入:无处理:调用显示信息模块,读取所有学生信息,按照英语成绩的升序格式化方式显示。输出:学号、姓名、数学成绩、英语成绩。7.2.2程序设计4.详细设计(4)浏览学生成绩模块show_student(self)功能:在主界面选择4,进入“浏览学生成绩”模块,显示数据文件中学生成绩等信息。输入:选择操作选项,主界面选择4,进入“浏览学生成绩”模块。处理:如果数据文件存在信息,将找到的学生信息保存到列表中,调用显示信息模块。输出:通过显示函数完成输出,判断列表中是否有数据,如果没有,提示无数据信息;如果有,则按格式输出包括“学号”,“姓名”,“数学成绩”,“英语成绩”对应的数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论