Python编程及项目开发课件 第4章 面向对象编程_第1页
Python编程及项目开发课件 第4章 面向对象编程_第2页
Python编程及项目开发课件 第4章 面向对象编程_第3页
Python编程及项目开发课件 第4章 面向对象编程_第4页
Python编程及项目开发课件 第4章 面向对象编程_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

PROGRAMMINGFUNDAMENTALSPython面向对象编程从基础概念到项目实战的系统学习指南封装Encapsulation继承Inheritance多态PolymorphismCONTENTS目录01面向对象编程基础理解面向对象编程的核心理念与基本概念,掌握封装、继承、多态三大特性02类的定义与使用掌握Python中类的定义语法、实例化方法,理解类与对象的关系03类的属性与方法深入理解类属性、实例属性以及实例方法、类方法、静态方法的区别04访问控制与封装掌握Python中的访问控制机制,学习如何通过封装保护数据安全05构造函数与析构函数理解对象的生命周期管理,掌握__init__和__del__方法的使用06类的继承掌握代码复用的核心技术,学习单继承、多重继承的实现与应用07类的重载掌握方法重载和运算符重载技术,实现灵活的类行为08项目开发实战通过学生管理系统、设备管理系统等实际项目巩固所学知识09习题与练习通过选择题、填空题、编程题全面检验学习成果01面向对象编程基础理解面向对象编程的核心理念与基本概念掌握封装、继承、多态三大特性面向过程vs面向对象核心概念设计方法01/OOPOVERVIEW什么是面向对象编程定义面向对象编程(ObjectOrientedProgramming,OOP)是一种全新的编程理念,目前已经渐渐成为主流的编程方法。它将数据和操作数据的方法组织在一起,作为相互依存的对象。Python是一门完全面向对象的编程语言,和SmallTalk、C++、Java等语言一样,支持完整的面向对象程序设计。发展历程1960s:Simula语言首次引入类和对象的概念1970s:Smalltalk完善面向对象编程范式1980s-90s:C++、Java等语言推广OOP2000s-至今:Python、C#等现代语言全面支持Python的OOP优势1简洁优雅的语法Python的类定义语法简洁明了,易于学习和使用2动态类型系统无需显式声明类型,支持鸭子类型和多态3多重继承支持支持复杂的多重继承关系,灵活构建类层次4丰富的魔术方法大量双下划线方法支持运算符重载和自定义行为核心理念"面向对象编程通过将数据和对数据的操作封装在一起,形成对象,从而更好地模拟现实世界,使代码更加模块化、可维护和可扩展。"01/PROGRAMMINGPARADIGMS面向过程vs面向对象以"五子棋"程序为例,对比两种编程范式的设计思路面向过程设计设计思路:分析问题的步骤,用函数逐步实现1.开始游戏2.黑子先走3.绘制画面4.判断输赢5.轮到白子6.绘制画面7.判断输赢8.返回步骤2特点以步骤为中心,按顺序执行函数调用面向对象设计玩家对象黑白双方接受用户输入,告知棋子布局变化棋盘对象负责绘制画面接收棋子变化,在屏幕上显示规则系统判定输赢、犯规对棋局进行判定特点以功能划分,对象间相互通信传递消息关键区别:面向过程以步骤为中心,面向对象以功能为中心。面向对象通过对象间的消息传递完成系统功能,更符合人类思维习惯。01/ADVANTAGES面向对象编程的四大优势01符合人类思维习惯对象对应于现实世界中的实体,可以很自然地按照现实世界中处理实体的方法来处理对象。软件开发者可以很方便地与问题提出者进行沟通和交流。实际案例设计一个学生管理系统时,"学生"、"课程"、"成绩"等概念与现实世界完全对应,业务人员和技术人员能够快速达成共识。02易于维护和扩展对象的封装性及对象之间的松散组合,都给软件的修改和维护带来了方便。改动只是局部的,不会影响整个系统的功能调用顺序。五子棋悔棋功能面向过程:需要改动输入→判断→显示整个流程;面向对象:只需改动棋盘对象,棋盘系统保存棋谱,简单回溯即可。03代码可重用性好重复使用一个类(类是对象的定义,对象是类的实例化),可以比较方便地构造出软件系统,加上继承的方式,极大地提高了软件开发的效率。继承的威力定义一个"用户"基类,管理员、普通用户、VIP用户都可以通过继承获得基本功能,只需添加各自特有的属性和方法。04与可视化技术结合随着基于图形界面操作系统的流行,面向对象的程序设计方法也深入人心。它与可视化技术相结合,使人机界面进入GUI时代。GUI开发窗口、按钮、文本框等界面元素都可以看作对象,通过设置属性和响应事件来构建交互式应用程序。01/CORECONCEPTS面向对象核心概念:对象与类对象(Object)现实世界中,对象是状态(属性)和行为的结合体。对象随处可见,一辆自行车、一名学生,他们都可视为对象。自行车的例子状态(属性)变速器脚蹬车轮刹车器行为(方法)加速刹车换挡软件开发中的对象在开发软件的信息世界中,对象定义为相关数据和方法的集合。类(Class)类是对象的模板。即类是对一组有相同数据和相同操作的对象的定义,一个类所包含的方法和数据描述一组对象的共同属性和行为。自行车类的定义自行车类定义了自行车必须有的状态和行为:变速器、脚蹬、车轮、刹车器、如何加速、如何刹车、如何换挡等。类→实例通过类可以生成一个有特定状态和方法的实例,这就是实例对象。类与对象的关系类模板/蓝图实例化对象具体实例01/CORECONCEPTS面向对象核心概念:消息与封装消息(Message)单独一个对象功能是有限的,多个对象联系在一起才会有更多、更强、更完整的功能。OOP使用消息传递机制来联系对象,消息传递是对象之间进行交互的主要方式。消息的组成1接收消息的对象消息的目标对象2消息名要调用的方法名称3实际变元传递给方法的参数消息传递示例player.click(x,y)→向棋盘对象发送消息→棋盘对象更新状态→向规则系统发送消息→规则系统判定输赢封装(Encapsulation)封装就是将相关数据和方法放在一个包里,其作用是把类设计成一个黑箱,使用户只能看见类具有的公共方法,看不到方法实现的细节,也不能直接对类的数据进行操作。封装的两大好处模块化对象源代码的编写和维护可以独立进行,不会影响到其它模块,而且有很好的重用性。数据隐藏对象有能力保护自己,提供一个公共接口和其他对象联系,自行维护自身的数据和方法。封装的意义封装性有效提高了程序的安全性与维护性,是面向对象编程的重要特性之一。01/CORECONCEPTS面向对象核心概念:继承与多态继承(Inheritance)OOP允许由一个类定义另外一个类。子类继承父类的状态和行为,也可以添加新的变量和方法,有自己的新特点。子类还可以覆盖继承下来的方法,实现特殊要求。继承的类型1单继承一个子类只有一个父类2多重继承一个子类有多个父类继承的示例山地车、赛车都属于自行车类,它们是自行车类的子类。自行车类是它们的父类或者称为超类。多态(Polymorphism)对象根据所接收的消息而做出动作。同一消息为不同的对象接受时可产生完全不同的行为,这种现象称为多态性。利用多态性,用户可发送一个通用的信息,而将所有的实现细节都留给接受消息的对象自行决定。多态的实现方式方法重写:子类重写父类的方法鸭子类型:Python的动态类型特性抽象基类:定义接口规范多态示例不同的动物对象(狗、猫、鸟)都接收到"叫"这个消息,但会发出不同的声音:汪汪、喵喵、叽叽喳喳。总结:类和继承是适应人们一般思维方式的描述范式,通过封装能将对象的定义和对象的实现分开,通过继承能体现类与类之间的关系,以及由此带来的动态连编和实体的多态性,从而构成了面向对象的基本特征。01/DESIGNMETHOD面向对象程序设计方法面向对象程序设计方法的基本过程1确定对象确定对象及其属性、方法等2分析联系分析对象之间的联系,确定通信机制3抽象为类将具有共同特征的对象抽象为对象类4设计实现设计、实现类,确定类相互间的继承关系5创建实例创建对象实例,实现对象间的相互联系设计原则对象以类的形式将其内部的数据或者方法封装。对象与对象之间只是相互传递数据,而不能访问其它对象的内部。对象的内部相对于其它对象来说是不可见的。注意事项不同的对象类之间可以通过继承的形式来拥有其它对象的属性和方法等,从而形成父子关系。合理设计类的层次结构是OOP成功的关键。02类的定义与使用掌握Python中类的定义语法和实例化方法理解类与对象的关系类定义语法实例化self参数02/CLASSDEFINITION类的定义语法函数定义vs类定义函数定义格式deffunctionName(args):'functiondocumentationstring'function_suite类定义格式classClassName:#类名'classdocumentationstring'#类文档字符串class_suite#类体关键说明创建类要使用"class"关键字类的名字紧跟其后,再后面是一个冒号(:)包含关键字class和类名的这一行称为"类头"类名遵循与变量一样的命名约定,通常首字母需大写最简单的Python类classDevice:pass说明1这个类的名字是Device,它没有从其它类得到继承。说明2这个类没有定义任何方法或属性,但是使用了一条什么都不做的pass语句。说明3pass是Python的保留字,类似Java、C++语言中的大括号空集{}。类体"类主体"class_suite是一个缩进的代码块,其中包含了从属于该类的方法和属性。类通常是在一个模块的最顶层定义的。02/CLASSEXAMPLE类定义实例:Device类完整代码classDevice:"""设备类"""#类的初始化函数def__init__(self,device_id,device_name,model):self.device_id=device_id#设备唯一IDself.device_name=device_name#设备名称self.model=model#设备型号self.status="stopped"#运行状态defstart(self):"""启动设备"""ifself.status!="running":self.status="running"returnf"设备{self.device_id}已启动"else:return"设备已在运行中"代码说明属性定义self.device_id、self.device_name、self.model、self.status都是类的数据属性方法定义start是类中的实例方法,用于启动设备初始化函数__init__是该类的构造函数,用于初始化对象数据self参数self指向新创建的对象,如同Java或C++中的this关键要点任何Python类方法的第一个参数都是self,这是一个命名习惯。在__init__方法中,self指向新创建的对象。02/INSTANTIATION类的实例化什么是实例化一旦定义好类,程序就能创建该类的实例。类是抽象的模板,而实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的方法,但各自的数据可能不同。Python的简洁性大多数OOP语言(比如Java、C++)在创建某个类的实例时需要使用new关键字,但是Python语言要简单很多。一旦类被定义好了,创建一个实例时只要调用类,好像它是一个函数。访问属性和方法对象通过点(.)访问运算符来访问对象的属性和方法。对象名在点的左侧,属性或方法在点的右侧。示例device1.start()表示访问device1的start()方法实例化代码示例#创建Device类的实例device1=Device("A001","空调","格力KFR-35GW")device2=Device("B001","加湿器","小熊JSQ-F40J1")#启动加湿器device2.start()#启动空调device1.start()创建实例通过Device(...)创建实例,传入__init__方法中的参数赋值变量将新创建的实例赋值给变量device1、device2调用方法通过device1.start()、device2.start()调用方法注意不同的实例拥有独立的数据,互不影响。device1和device2虽然都是Device类的实例,但它们的device_id、device_name等属性值各不相同。02/INSTANTIATIONDEMO实例化代码演示完整示例代码classDevice:def__init__(self,device_id,device_name,model):self.device_id=device_idself.device_name=device_nameself.model=modelself.status="stopped"defstart(self):ifself.status!="running":self.status="running"returnf"设备{self.device_id}已启动"else:return"设备已在运行中"defget_info(self):returnf"{self.device_name}({self.model})-{self.status}"#创建多个实例device1=Device("A001","空调","格力KFR-35GW")device2=Device("B001","加湿器","小熊JSQ-F40J1")device3=Device("C001","电视机","小米L55M5")#调用方法print(device1.start())print(device2.start())print(device1.get_info())print(device2.get_info())运行结果设备A001已启动设备B001已启动空调(格力KFR-35GW)-running加湿器(小熊JSQ-F40J1)-running实例分析device1空调-格力KFR-35GW状态:runningdevice2加湿器-小熊JSQ-F40J1状态:runningdevice3电视机-小米L55M5状态:stopped关键观察每个实例都有独立的数据,互不影响。device1、device2、device3虽然都是Device类的实例,但它们的属性值各不相同。CHAPTER03类的属性与方法深入理解类属性、实例属性以及三种方法类型类属性实例属性三种方法03/ATTRIBUTES类属性与实例属性类属性类属性通常都用来保存与类相关联的值,不依赖于任何类实例。类属性属于类本身,可以被类的所有实例共享。使用特点类数据属性属于类本身,可以通过类名进行访问/修改类数据属性也可以被类的所有实例访问/修改在类定义之后,可以通过类名动态添加类数据属性典型应用场景所有实例共享的数据,如计数器、配置信息、常量等。例如:所有汽车默认都有4个轮子。实例属性实例数据属性是与某个类的实例相关联的数据值,这些值独立于其它实例或类。当一个实例被释放后,它的属性同时也被清除。使用特点实例数据属性只能通过实例访问在实例生成后,还可以动态添加实例数据属性动态添加的实例数据属性只属于该实例典型应用场景每个实例独有的数据,如姓名、ID、状态等。例如:每辆汽车有不同的品牌和颜色。重要提示:在大多数情况下,实例属性要比类属性用得更多一些。类属性适合存储所有实例共享的数据,而实例属性适合存储每个实例独有的数据。03/ATTRIBUTEEXAMPLE属性使用实例:Car类完整代码classCar:#类属性(所有车辆共有特征)wheels=4#所有汽车默认4个轮子vehicle_type="机动车"def__init__(self,brand,color):#实例属性(每个车辆独有特征)self.brand=brand#品牌self.color=color#颜色defshow_info(self):print(f"{self.color}色{self.brand}|类型:\{self.vehicle_type}|轮子:{self.wheels}个")#创建两个实例car1=Car("丰田","黑")car2=Car("本田","白")#初始状态查看print("【初始状态】")car1.show_info()#黑色丰田|类型:机动车|轮子:4个car2.show_info()#白色本田|类型:机动车|轮子:4个#修改实例属性(只影响当前实例)car1.color="银"#修改car1的颜色car2.brand="奔驰"#修改car2的品牌#修改类属性(影响所有实例)Car.wheels=6#所有车辆改为6个轮子Car.vehicle_type="大型车辆"#修改车辆类型#创建新实例car3=Car("特斯拉","蓝")print("\n【修改后状态】")car1.show_info()#银色丰田|类型:大型车辆|轮子:6个修改属性#修改实例属性car1.color="银"car2.brand="奔驰"#修改类属性Car.wheels=6Car.vehicle_type="大型车辆"修改后状态car1银色丰田|类型:大型车辆|轮子:6个car2白色奔驰|类型:大型车辆|轮子:6个car3(新创建)蓝色特斯拉|类型:大型车辆|轮子:6个关键观察修改类属性会影响所有实例,修改实例属性只影响当前实例。03/SPECIALATTRIBUTES类的特殊属性__name__类的名字(字符串)Animal.__name____doc__类的文档字符串Animal.__doc____bases__类的所有父类Animal.__bases____dict__类的属性字典Animal.__dict____module__类所属的模块Animal.__module____class__类对象的类型Animal.__class__使用示例classAnimal: '''thisisaAnimalclass''' count=0 legs=[] def__init__(self,name): =nameprint("name:",Animal.__name__)print("doc:",Animal.__doc__)print("bases:",Animal.__bases__)print("dict:",Animal.__dict__)print("module:",Animal.__module__)CHAPTER04访问控制与封装掌握Python中的访问控制机制学习如何通过封装保护数据安全私有属性访问控制数据保护04/ACCESSCONTROLPython的访问控制机制Python中没有像Java中private、protected等访问控制的关键字,但在Python编码中,使用一些约定来进行访问控制。__双下划线开头含义名称以两个下划线开始(但不是结束),它是私有的作用外部代码不能随意修改对象内部的状态示例self.__name_单下划线开头含义以单下划线"_"开头的变量、函数为模块私有的作用"from模块名import*"不会引入以"_"开头的成员示例self._value____双下划线前后含义这种用法表示Python中的特殊方法名作用确保不会与用户自定义的名称冲突示例__init__,__del__04/ACCESSCONTROLPython的访问控制机制classBankAccount:def__init__(self,account_holder,initial_balance=0):#公有属性(公开可访问)self.holder=account_holder

#私有属性(双下划线开头,外部无法直接访问)self.__balance=initial_balance

defdeposit(self,amount):"""存款方法(安全修改私有属性)"""ifamount>0:self.__balance+=amountprint(f"成功存入

¥{amount:.2f}")else:print("存款金额必须大于0")defwithdraw(self,amount):"""取款方法(安全访问私有属性)"""ifamount>self.__balance:print("余额不足")else:self.__balance-=amountprint(f"成功取出

¥{amount:.2f}")defcheck_balance(self):"""查询余额(安全访问私有属性)"""print(f"当前余额:¥{self.__balance:.2f}")#创建账户实例my_account=BankAccount("张三",1000)#正常操作(通过公共方法)my_account.check_balance()#当前余额:¥1000.00my_account.deposit(500)#成功存入¥500.00my_account.withdraw(200)#成功取出¥200.00my_account.check_balance()#当前余额:¥1300.00#尝试直接访问私有属性(会失败)try:print(my_account.__balance)#触发AttributeErrorexceptAttributeErrorase:print(f"错误信息:{e}")#'BankAccount'objecthasnoattribute'__balance'【例4-8】通过一个“银行账户”的案例演示类的私有属性用法,展示如何保护敏感数据。05构造函数与析构函数理解对象的生命周期管理掌握__init__和__del__方法的使用构造函数析构函数生命周期06类的继承掌握代码复用的核心技术学习单继承、多重继承的实现与应用单继承多重继承方法重写06/类的继承classUser:def__init__(self,user_id,username,password):self.user_id=user_id#用户的唯一标识self.username=username#用户名self.password=password#密码defview_profile(self):print(f"UserID:{self.user_id},Username:{self.username}")defchange_password(self,new_password):self.password=new_passwordprint(f"Passwordforuser{self.username}hasbeenchanged.")#定义派生类Admin(管理员用户类),继承自UserclassAdmin(User):def__init__(self,user_id,username,password):super().__init__(user_id,username,password)#调用基类的构造函数初始化用户信息defadd_user(self,user):#模拟添加用户到系统print(f"Admin{self.username}addeduser{user.username}tothesystem.")defremove_user(self,user):#模拟从系统中删除用户print(f"Admin{self.username}removeduser{user.username}fromthesystem.")defview_users(self,users):#显示所有用户信息print(f"Admin{self.username}isviewingallusers:")foruserinusers:user.view_profile()#创建User和Admin的实例user1=User(user_id="U001",username="john_doe",password="password123")user2=User(user_id="U002",username="jane_smith",password="securepassword")admin=Admin(user_id="A001",username="admin_user",password="adminpass")#调用方法user1.view_profile()#输出:UserID:U001,Username:john_doeuser1.change_password("newpassword")#输出:Passwordforuserjohn_doehasbeenchanged.admin.view_profile()#输出:UserID:A001,Username:admin_useradmin.add_user(user2)#输出:Adminadmin_useraddeduserjane_smithtothesystem.admin.remove_user(user1)#输出:Adminadmin_userremoveduserjohn_doefromthesystem.#创建一个用户列表users=

温馨提示

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

评论

0/150

提交评论