Python程序设计项目化教程 课件 项目6 面向对象编程_第1页
Python程序设计项目化教程 课件 项目6 面向对象编程_第2页
Python程序设计项目化教程 课件 项目6 面向对象编程_第3页
Python程序设计项目化教程 课件 项目6 面向对象编程_第4页
Python程序设计项目化教程 课件 项目6 面向对象编程_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

《Python程序设计项目化教程》面向对象编程主讲人:xxx项目6类设计与实现掌握类的定义、对象的创建、属性与方法的使用实现封装通过私有属性和公共方法保护敏感数据用继承扩展功能通过子类扩展父类功能,实现代码复用多态与特殊方法掌握多态思想和特殊方法的使用场景综合运用面向对象特性,构建功能完善的系统CONTENTS0105项目演练:学生信息管理系统V4.0020304PROJECTBACKGROUND现有系统的局限性在前述项目中,我们使用列表、字典等组合数据类型实现了学生信息管理。但随着系统功能逐渐复杂,代码的可读性、复用性和可维护性面临挑战。数据与操作分离,难以组织和管理大量相关联的功能。面向对象编程的解决方案面向对象编程(OOP)通过封装、继承、多态等特性,将数据与操作数据的方法封装为"类"。就像现实世界中"学生"实体拥有属性(学号、姓名)和行为(选课、考试),我们可以用"类"精准映射现实实体,让程序设计更贴近人类思维模式。项目目标本项目将围绕"学生信息管理系统",通过设计Student类、实现封装、扩展继承功能、应用多态特性,帮助学生掌握面向对象编程的核心思想与实践技巧,为开发复杂系统奠定基础。项目背景LEARNINGOBJECTIVES01理解类与对象的概念掌握类的定义、对象的创建及属性与方法的使用,理解"类是对象的模板,对象是类的实例"这一核心关系。02掌握封装的实现方式能通过私有属性和公共方法保护敏感数据,理解封装在数据安全中的重要作用。03理解继承的意义能通过子类扩展父类功能,实现代码复用,构建层次分明的类结构。04了解多态的特性掌握特殊方法的使用,理解"同一接口,不同实现"的思想,提升代码灵活性。05综合应用能力能综合运用面向对象思想设计并实现学生信息管理系统,将理论知识转化为实际项目开发能力。学习目标IDEOLOGICALANDPOLITICALGUIDANCE从类的设计看工匠精神优秀的类设计需平衡简洁与扩展,如同工匠打造工具,既满足当下需求,又为未来升级留有余地。通过对比面向过程与面向对象实现的学生系统,体会"一次设计,多次复用"的效率价值,培养学生精益求精、追求卓越的工匠精神。封装与数据安全意识通过将成绩、身份证号等敏感信息设为私有属性,仅通过受控方法访问,呼应《中华人民共和国个人信息保护法》中"个人信息处理应采取安全技术措施"的要求。培养学生数据保护的责任意识,将法律法规融入技术实践。继承与系统思维子类对父类的扩展,体现"站在巨人肩膀上"的设计智慧。正如教育体系中的进阶培养,既保留基础要求,又新增专项能力。通过继承关系的学习,培养学生分层设计的系统思维,理解从一般到特殊的认知规律。思政引领任务6.1类设计与实现6.1从类的定义到对象的创建掌握面向对象编程的基础与核心类的定义对象的创建属性与方法类设计与实现TASK6.1DESCRIPTION任务描述任务目标设计学生信息管理系统的核心类——Student类封装内容通过类封装学生的基本属性及行为核心能力掌握类的定义、对象的创建、属性与方法的基本使用关键理解理解"类是对象的模板,对象是类的实例"这一核心关系Student类将封装以下内容student_id-学号name-姓名age-年龄gender-性别class_name-班级Student类的方法设计def__init__(self,...):#初始化属性→创建对象时自动调用defshow_info(self):#显示学生信息→打印学生的完整信息defupdate_info(self,...):#更新学生信息→支持修改年龄、班级等属性TASK6.1PREPARATION类(Class)类是对现实实体的抽象描述,包含实体的属性(数据)和方法(行为)。类的定义格式class类名:#属性定义#方法定义例如:"学生"类可描述学生共有的学号、姓名等属性以及上课、考试等行为对象(Object)对象是类的实例化结果,是具体的实体。对象的创建格式对象名=类名(参数)例如:"张三"是"学生"类的一个对象对象拥有类定义的属性和方法类属性vs实例属性类属性定义在类内部、所有方法之外,被该类的所有实例对象共享classStudent:school="XX大学"实例属性在__init__方法中定义,每个对象独有def__init__(self,name):=name任务准备:类与对象的基本概念TASK6.1PREPARATION__init__初始化方法__init__方法是类的初始化方法,创建对象时自动调用,用于初始化实例属性。class类名:def__init__(self,参数1,参数2...):self.属性1=参数1self.属性2=参数2self代表当前对象,必须作为第一个参数方法的定义类中定义的函数,用于实现对象的行为,第一个参数必须是self。def方法名(self,参数1,参数2...):#方法体pass方法通过self.属性名访问属性调用方法使用对象名.方法名()简单类的定义与使用示例#定义Person类classPerson:def__init__(self,name,age):=nameself.age=agedefshow_info(self):print(f"姓名:{},年龄:{self.age}")#创建对象p1=Person("张三",18)p2=Person("李四",19)#调用方法p1.show_info()#输出:姓名:张三,年龄:18p2.show_info()#输出:姓名:李四,年龄:19任务准备:类的属性与方法TASK6.1IMPLEMENTATIONStudent类需满足学生信息管理的基础需求1.属性设计需包含学生的核心信息,具体如下表所示:属性名称类型说明student_id字符串唯一标识,如"1001"name字符串学生姓名,如"张三"age整数年龄,如18gender字符串性别,如"男"class_name字符串班级,如"计算机1班"2.方法设计(1)初始化:__init__通过__init__方法为属性赋值,创建对象时自动调用(2)显示信息:show_info()打印学生完整信息,格式化输出所有属性(3)更新信息:update_info()支持修改年龄、班级等属性,使用**kwargs接收关键字参数使用hasattr()检查属性是否存在,setattr()修改属性值任务实施:任务分析TASK6.1IMPLEMENTATION基于学生信息管理需求,设计Student类的完整结构,包含核心属性和基本操作方法。classStudent:"""学生类,封装学生的基本信息与操作"""def__init__(self,student_id,name,age,gender,class_name):"""初始化学生属性"""self.student_id=student_id=nameself.age=ageself.gender=genderself.class_name=class_namedefshow_info(self):"""显示学生完整信息"""info=(f"学号:{self.student_id}\n"f"姓名:{}\n"f"年龄:{self.age}\n"f"性别:{self.gender}\n"f"班级:{self.class_name}")print(info)defupdate_info(self,**kwargs):"""更新学生信息(支持年龄、班级等属性修改)"""forkey,valueinkwargs.items():ifhasattr(self,key):setattr(self,key,value)print(f"已更新{key}为:{value}")else:print(f"不存在属性:{key}")使用文档字符串说明类和方法的作用**kwargs接收关键字参数字典使用hasattr()和setattr()安全访问属性任务实现:定义Student类TASK6.1IMPLEMENTATION任务实现:创建Student对象并使用创建对象并调用方法#创建学生对象stu1=Student("1001","张三",18,"男","计算机1班")stu2=Student("1002","李四",19,"女","计算机2班")#显示学生信息print("学生1信息:")stu1.show_info()#更新学生信息print("\n更新学生1信息:")stu1.update_info(age=19,class_name="计算机3班")#查看更新后信息print("\n更新后学生1信息:")stu1.show_info()运行结果学生1信息:学号:1001姓名:张三年龄:18性别:男班级:计算机1班更新学生1信息:已更新age为:19已更新class_name为:计算机3班更新后学生1信息:学号:1001姓名:张三年龄:19性别:男班级:计算机3班1创建对象使用类名()创建对象,自动调用__init__方法初始化属性2调用方法使用对象名.方法名()调用类中定义的方法3更新属性update_info()方法支持动态修改对象属性TASK6.1SUMMARY核心知识点本任务围绕类与对象的核心知识点展开,介绍了类的定义和创建对象的方法。掌握类的基本结构是学习面向对象编程的基础。理解类与对象的关系:类是模板,对象是实例掌握__init__方法的使用和self参数的含义学会定义属性和方法,实现类的功能后续可拓展至继承、多态等高级特性后续学习路径后续可拓展至继承、多态等高级特性,提升代码复用性与可维护性。通过合理运用这些特性,可以构建出更加灵活、可扩展的程序架构。常见问题与解决方法❌忘记self参数方法定义时未加self,调用时报错✓确保方法的第一个参数为self❌属性访问错误访问不存在的属性会报AttributeError✓通过hasattr(self,key)检查属性是否存在❌初始化参数缺失创建对象时参数数量与__init__不匹配✓检查参数数量与顺序是否正确任务总结TASK6.1TEST一、选择题1.在Python中,类的定义使用哪个关键字?A.classB.defC.structD.object2.以下哪个是类的实例化正确语法?A.Student()B.newStudent()C.Student.create()D.Student.new()3.在Student类中,self参数的作用是:A.表示当前类的实例B.表示父类C.表示静态方法D.表示私有属性4.以下关于Python类的描述,正确的是?A.__init__负责创建对象实例B.类属性定义在__init__方法中C.通过"类名.类属性"修改时所有对象同步变化D.实例属性定义在类内部、所有方法之外二、判断题✓1.一个类可以创建多个对象实例。✓2.类的方法必须包含self参数。✗3.__init__方法可以有返回值。三、简答题1.简述类和对象之间的关系。答:类是对象的抽象模板,对象是类的具体实例。2.为什么要在类的方法中使用self参数?答:self代表当前对象本身,通过self可以访问对象的属性和方法。四、编程题1.创建一个Student类,包含name和age属性。2.给Student类添加一个introduce方法,用于介绍自己的基本信息。任务测试任务6.2实现封装6.2数据隐藏与接口暴露保护敏感信息,实现操作可控私有属性公共方法数据安全实现封装TASK6.2DESCRIPTION任务描述封装目标对Student类进行封装处理私有属性将成绩等敏感信息设为私有属性公共方法仅通过受控方法访问或修改,防止数据被随意篡改核心能力理解封装的意义,掌握私有属性的定义与访问控制方法封装前后的对比❌封装前:属性可直接访问和修改stu.score=-10#可以设置为负数,不合理stu.id_card="123"#可以设置任意值✓封装后:通过受控方法访问stu.set_score(-10)#验证不通过,拒绝修改stu.set_id_card("123")#验证长度,拒绝修改数据验证,确保数据有效性信息脱敏,保护敏感数据接口统一,便于维护和扩展隐藏实现,降低耦合度TASK6.2PREPARATION什么是封装封装是面向对象的三大特性之一,指将对象的属性和方法隐藏在类内部,仅通过公共接口(方法)与外部交互,实现"数据隐藏"和"操作可控"。封装的作用保护敏感数据,如成绩、身份证号避免不合理的修改,确保数据有效性隐藏实现细节,降低代码耦合度封装的实现方式在属性或方法名前加双下画线__,使其成为私有成员,外部无法直接访问。classStudent:def__init__(self):self.__score=0#__score为私有属性私有属性外部无法直接访问,会报AttributeError封装的核心优势数据安全防止外部随意修改数据验证确保数据有效性信息脱敏保护敏感信息易于维护修改不影响外部任务准备:封装的基本概念TASK6.2PREPARATION私有属性名称以__开头,仅能在类内部访问,外部直接访问会报错。classBankAccount:def__init__(self,balance):self.__balance=balance#__balance为私有属性❌外部直接访问会报错acc=BankAccount(1000)print(acc.__balance)#AttributeError公共方法提供给外部的接口,用于安全地访问或修改私有属性。通常命名为get_xxx和set_xxx。defget_balance(self):returnself.__balancedefdeposit(self,amount):ifamount>0:self.__balance+=amount通过公共方法可以添加验证逻辑,确保数据合法性封装示例:BankAccount类classBankAccount:def__init__(self,account_id,balance=0):self.account_id=account_idself.__balance=balancedefget_balance(self):returnself.__balancedefdeposit(self,amount):ifamount>0:self.__balance+=amount任务准备:私有属性与公共方法TASK6.2IMPLEMENTATION在构建Student类时,需对部分属性进行封装处理1.需封装的属性成绩(__score)成绩具有特定的取值范围,应限定在0到100之间为保证数据的准确性,不允许直接将成绩修改为负数或者超过100的数值身份证号(__id_card)身份证号属于个人敏感信息若直接完整显示可能会造成信息泄露,需要对其进行脱敏处理2.公共方法设计get_score()-获取学生的成绩set_score(score)-设置成绩(验证范围0-100)set_id_card(id_card)-验证并设置身份证号get_id_card_masked()-返回脱敏后的身份证号通过统一的接口方法,实现对敏感数据的受控访问和修改任务实施:任务分析TASK6.2IMPLEMENTATION为保护敏感数据和确保数据有效性,在Student类中添加私有属性及相应的访问控制方法。classStudent:def__init__(self,student_id,name,age,gender,class_name):self.student_id=student_id=nameself.age=ageself.gender=genderself.class_name=class_nameself.__score=0self.__id_card=""#成绩相关方法defget_score(self):returnself.__scoredefset_score(self,score):ifisinstance(score,(int,float))and0<=score<=100:self.__score=scoreprint(f"成绩设置成功:{score}")else:print("成绩无效(需为0-100的数字)")#身份证号相关方法defset_id_card(self,id_card):iflen(id_card)==18andid_card.isdigit():self.__id_card=id_cardprint("身份证号设置成功")else:print("身份证号无效(需18位数字)")defget_id_card_masked(self):ifself.__id_card:returnself.__id_card[:6]+"****"+self.__id_card[-4:]else:return"未设置身份证号"私有属性以__开头使用isinstance()验证类型验证成绩范围0-100身份证号脱敏处理任务实现:修改Student类,添加私有属性及封装方法TASK6.2IMPLEMENTATION测试封装代码#创建学生对象stu=Student("1001","张三",18,"男","计算机1班")#操作成绩(通过公共方法)stu.set_score(95)print("当前成绩:",stu.get_score())stu.set_score(150)#操作身份证号stu.set_id_card()print("脱敏身份证号:",stu.get_id_card_masked())#尝试直接访问私有属性(报错)try:print(stu.__score)exceptAttributeErrorase:print("错误:",e)#显示完整信息print("\n学生完整信息:")stu.show_info()运行结果成绩设置成功:95当前成绩:95成绩无效(需为0-100的数字)身份证号设置成功脱敏身份证号:110101****1234错误:'Student'objecthasnoattribute'__score'学生完整信息:学号:1001姓名:张三年龄:18性别:男班级:计算机1班成绩:95身份证号:110101****1234数据验证无效的成绩值会被拒绝,保证数据合法性访问控制外部无法直接访问私有属性,确保数据安全信息脱敏身份证号中间部分用****隐藏,保护隐私任务实现:测试封装效果TASK6.2SUMMARY核心知识点本任务围绕Student类的封装展开,通过将成绩、身份证号等敏感信息设为私有属性,并搭配精心设计的公共方法,实现数据的安全访问与修改。理解封装的意义:数据隐藏和操作可控掌握私有属性的定义:以__开头学会设计get/set方法访问私有属性掌握数据验证和脱敏处理技巧法律依据呼应《中华人民共和国个人信息保护法》中"个人信息处理应采取安全技术措施"的要求,将法律意识融入技术实践。常见问题与解决方法❌私有属性访问错误在外部直接访问__score等私有属性时,会触发AttributeError✓通过设计对应的get_xxx公共方法安全获取值❌修改器逻辑漏洞在set_score等修改器方法中,若未对参数类型进行验证,可能出现传入字符串等不合理数据✓使用isinstance()对参数类型进行严格验证❌脱敏逻辑失效若身份证号长度不足18位,直接脱敏会导致结果出错✓在set_id_card方法中先验证身份证号长度任务总结任务6.3用继承扩展功能

6.3站在巨人肩膀上实现代码复用与功能扩展代码复用功能扩展层次结构用继承扩展功能TASK6.3DESCRIPTION&PREPARATION任务描述本任务将通过继承实现功能扩展:创建college_Student(大学生)类,继承Student类的所有属性和方法,并新增"论文成绩"属性及相关操作方法。核心目标理解继承的作用:代码复用和功能扩展掌握子类定义和父类方法调用学会方法重写和新增属性的实现什么是继承继承允许我们创建一个新的类(子类),自动获取父类所定义的属性和方法,无需重复编写代码。#父类class父类名:pass#子类class子类名(父类名):#子类的属性和方法例如:"大学生"是"学生"的特定一部分,可以继承"学生"类的通用特征继承的作用代码复用子类自动获取父类的所有非私有属性和方法,无需重复编写相同的代码,极大地提高了代码的复用性。层次结构清晰地体现对象之间的"特殊与一般"的关系,有助于构建层次分明、逻辑清晰的类结构。任务描述与准备:继承的基本概念TASK6.3PREPARATION单继承一个子类只继承一个父类,这是最常见也最简单的继承形式。#父类:AnimalclassAnimal:def__init__(self,name):=namedefeat(self):print(f"{}在吃东西")#子类:Dog(继承Animal)classDog(Animal):def__init__(self,name,breed):super().__init__(name)self.breed=breedsuper()用于调用父类的方法多继承一个子类同时继承多个父类,整合多个不同父类的属性和方法。#多继承语法class子类名(父类1,父类2,...):pass#示例:学生运动员classStudentAthlete(Student,Athlete):def__init__(self,...):Student.__init__(self,...)Athlete.__init__(self,...)Python采用MRO机制确定方法的调用顺序Dog类使用示例#创建Dog对象dog=Dog("旺财","金毛")#调用重写的方法dog.eat()#输出:旺财在啃骨头#调用继承的方法dog.sleep()#输出:旺财在睡觉#调用子类新增方法dog.bark()#输出:旺财(金毛)在汪汪叫运行结果旺财在啃骨头旺财在睡觉旺财(金毛)在汪汪叫任务准备:单继承与多继承TASK6.3IMPLEMENTATION创建college_Student类继承自Student基类,通过super()调用父类构造方法,并新增专业属性和论文成绩相关方法。fromstudentimportStudentclasscollege_Student(Student):"""大学生类,继承Student类,新增论文成绩属性"""def__init__(self,student_id,name,age,gender,class_name,major):#调用父类的初始化方法super().__init__(student_id,name,age,gender,class_name)self.major=majorself.__thesis_score=0#论文成绩相关方法defget_thesis_score(self):"""获取论文成绩"""returnself.__thesis_scoredefset_thesis_score(self,score):"""设置论文成绩(验证范围0-100)"""ifisinstance(score,(int,float))and0<=score<=100:self.__thesis_score=scoreprint(f"论文成绩设置成功:{score}")else:print("论文成绩无效(需为0-100的数字)")使用super()调用父类方法新增major专业属性和论文成绩方法重写show_info()方法扩展信息任务实现:定义college_Student子类#重写父类的show_info方法defshow_info(self):info=(f"学号:{self.student_id}\n"f"姓名:{}\n"f"年龄:{self.age}\n"f"性别:{self.gender}\n"f"班级:{self.class_name}\n"f"专业:{self.major}\n"f"课程成绩:{self.get_score()}\n"f"论文成绩:{self.__thesis_score}\n"f"身份证号:{self.get_id_card_masked()}")print(info)TASK6.3IMPLEMENTATION测试子类代码#创建大学生对象coll_stu=college_Student("2001","王五",22,"男","大一","人工智能")#调用继承的方法coll_stu.set_score(88)coll_stu.set_id_card()#调用子类新增方法coll_stu.set_thesis_score(92)print("论文成绩:",coll_stu.get_thesis_score())#调用重写的show_info方法print("\n大学生信息:")coll_stu.show_info()#验证继承关系print("\n是否为Student类实例:",isinstance(coll_stu,Student))print("是否为college_Student类实例:",isinstance(coll_stu,college_Student))运行结果成绩设置成功:88身份证号设置成功论文成绩设置成功:92论文成绩:92大学生信息:学号:2001姓名:王五年龄:22性别:男班级:大一专业:人工智能课程成绩:88论文成绩:92身份证号:310101****5678是否为Student类实例:True是否为college_Student类实例:True继承验证子类可以调用父类的所有公共方法功能扩展子类新增专业属性和论文成绩相关方法方法重写重写show_info()方法,显示专业和论文成绩任务实现:测试子类功能任务6.4多态与特殊方法6.4同一接口,不同实现让对象像内置类型一样自然地工作多态特性特殊方法接口统一多态与特殊方法TASK6.4PREPARATION多态的基本概念多态是指不同类的对象可以通过相同的接口(方法名)调用不同的实现逻辑,即同一操作作用于不同对象时,会产生不同的执行结果。#父类classAnimal:defspeak(self):return"动物叫"#子类classCat(Animal):defspeak(self):return"喵喵叫"核心思想:"同一接口,不同实现"特殊方法(魔术方法)特殊方法以__开头和结尾,用于实现对象的特定行为,使类的实例能够像内置类型一样自然地与Python语法交互。常见的特殊方法__str__(self)-返回对象的字符串表示__lt__(self,other)-定义小于比较(<)__gt__(self,other)-定义大于比较(>)__len__(self)-返回对象的"长度"__eq__(self,other)-定义相等判断(==)重写特殊方法可以让自定义类支持Python内置语法多态示例:动物叫声deftest(animal):print(animal.speak())#创建不同子类实例c1=Cat()d1=Dog()#调用同一接口,执行不同实现test(c1)#输出:喵喵叫test(d1)#输出:汪汪叫运行结果喵喵叫汪汪叫多态的优势无需修改调用代码只需添加新的子类并重写方法符合"开闭原则"任务准备:多态与特殊方法TASK6.4IMPLEMENTATIONStudent基类classStudent:defget_total_score(self):returnself.__scoredef__str__(self):returnf"[{self.student_id}]{}"def__lt__(self,other):ifisinstance(other,Student):returnself.get_total_score()<other.get_total_score()returnFalsedef__len__(self):return5学生:综合评分=课程成绩(100%)college_Student子类classcollege_Student(Student):#多态方法:综合评分defget_total_score(self):return0.6*self.get_score()+0.4*self.__thesis_scoredef__str__(self):returnf"[{self.student_id}]{}({self.major})"def__len__(self):return7大学生:综合评分=课程成绩×60%+论文成绩×40%多态与特殊方法的作用__str__方法让对象可以直接打印,输出友好的字符串表示

温馨提示

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

评论

0/150

提交评论