Python程序设计基础教程(微课版) 课件 第7章 - Python面向对象编程_第1页
Python程序设计基础教程(微课版) 课件 第7章 - Python面向对象编程_第2页
Python程序设计基础教程(微课版) 课件 第7章 - Python面向对象编程_第3页
Python程序设计基础教程(微课版) 课件 第7章 - Python面向对象编程_第4页
Python程序设计基础教程(微课版) 课件 第7章 - Python面向对象编程_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

Python程序设计第7章Python面向对象编程学习目标识记类的语法理解面向对象三大特征掌握面向对象三大特征的使用方法知识目标能够正确编写Python类能够使用Python类解决实际问题能力目标数据隐私的尊重和保护创新精神和可持续发展意识多样性思维和包容性情感态度与价值观Python类与对象01020403封装继承多态目

录Python类与对象01020403封装继承多态目

录面向对象基本概念类的定义对象的使用面向过程程序设计以算法为中心问题->一系列步骤制作蛋糕:准备材料->搅拌面糊->烤制蛋糕胚->涂抹奶油->裱花装饰mix_batter(flour)bake_cake(power,minites)spread_cream(color)decoration(cream,ftruits,chocolate)面向对象程序设计7.1.1面向过程与面向对象程序设计1457.1.2类与对象146现实含义面向对象程序设计类和对象类一群具有相似特征或行为的个体的统称模板或者蓝图规定了一组属性(变量)和一组方法(函数)属于自定义的数据类型人类-张三宠物类-萨摩耶肉包微波炉类-货架上待售的某台微波炉对象某个类的一个具体实例,具有该类的属性和行为根据模板将属性值具体化之后,得到的一个类的实例个体拥有具体的属性值能使用类定义的方法封装:将数据和操作捆绑在一起,形成一个类定义每个类的职责隐藏了内部实现细节提高代码可读性和可维护性增加了数据的安全性和可靠性。继承:从已有的类派生出新类的过程避免重复编写相同的代码方便系统扩展多态:提高了代码的灵活性和扩展性7.1.3面向对象三大特征1467.2类的定义与对象使用1477.2.1关键字class147class:定义类定义一个空类class类名:#类体classCircle:pass示例7-17.2.2类属性和类方法147类属性:与类本身关联的属性所有对象能够共享的属性对于具体的实例来说意义不大类属性位于类的顶部,定义在类的任何方法之外使用类属性class类名:类属性1=值1类属性2=值2类名.类属性名7.2.2类属性和类方法148类属性的定义和使用classCircle:pi=3.14159default_line_color='黑色'default_fill_color='白色'print(Circle.pi)Circle.default_line_color='红色'示例7-27.2.2类属性和类方法148类方法:封装与类属性有关、与实例无关的功能不能直接访问实例属性和实例方法调用类方法class类名:@classmethoddef类方法名(cls,参数列表)#函数体类名.类方法(除cls之外的参数值)使用装饰器@classmethodcls:代表该方法所属的类,在类方法内部将cls当类名使用7.2.2类属性和类方法148类方法的定义和使用classCircle:@classmethoddefset_default_color(cls,line,fill):cls.default_line_color=linecls.default_fill_color=fillCircle.set_default_color('深蓝色','浅蓝色')示例7-37.2.3实例属性和实例方法149实例属性:类的对象各自持有的属性标识对象本身的特征值与对象自身密切关联,不应与其他对象共享举例每个人的身份证号每台洗衣机的品牌和型号每本书的书名和作者实例属性通常写在类的__init__()方法中7.2.3实例属性和实例方法149__init__()方法调用时机:创建类的新对象时作用:初始化新对象命名:__方法名__特定场景下自动调用开发者考虑具体实现魔术方法class类名:def__init__(self,参数1,参数2,...,参数N)self.实例属性1=参数1self.实例属性2=参数2...self.实例属性N=参数Nself:代表即将被创建出来的新对象self.实例属性名=值7.2.3实例属性和实例方法149实例属性的定义classCircle:def__init__(self,r,line_color=default_line_color,fill_color=default_fill_color):self.r=rself.line_color=line_colorself.fill_color=fill_color示例7-47.2.3实例属性和实例方法149实例的创建变量名=类名(__init__()方法中除了self之外的参数)classCircle:def__init__(self,r,

ine_color=default_line_color,fill_color=default_fill_color):

self.r=rself.line_color=line_colorself.fill_color=fill_colorc1=Circle(1.0)c2=Circle(2.0,'红色','黄色')示例7-47.2.3实例属性和实例方法150实例属性的使用对象.实例属性名classCircle:def__init__(self,r,

line_color=default_line_color,fill_color=default_fill_color):self.r=rself.line_color=line_colorself.fill_color=fill_colorc1=Circle(1.0)c2=Circle(2.0,'红色','黄色')print(f'半径{c1.r},线条{c1.line_color},填充{c1.fill_color}')示例7-47.2.3实例属性和实例方法150实例方法:与具体的对象关联的方法需要对象执行的行为调用实例方法class类名:def实例方法名(self,参数1,参数2,...,参数N)#代码块对象.实例方法(除self之外的其他参数)self:代表正在调用这个实例方法的对象7.2.3实例属性和实例方法150实例方法的定义与调用classCircle:def__init__(self,r,

line_color=default_line_color,fill_color=default_fill_color):self.r=rself.line_color=line_colorself.fill_color=fill_color

defdraw(self):print(f'绘制圆:半径{self.r},线条{self.line_color},填充{self.fill_color}')c1=Circle(2.0,'红色','黄色')c1.draw()示例7-57.2.4静态方法150静态方法逻辑上功能和类相关放在类中更合适通过“类名.静态方法()”调用class类名:@staticmethoddef方法名(参数列表)#函数体使用装饰器@staticmethod7.2.4静态方法151静态方法的定义和调用classCircle:pi=3.14159@staticmethoddefcalc_area(r):returnr**2*Circle.piprint(Circle.calc_area(2.0))示例7-6Python类与对象01020403封装继承多态目

录封装020403继承多态目

录Python类与对象01Python实现封装@property7.3封装151封装:信息隐藏只对外提供必要的属性和方法,提高代码安全性外部不关心对象内部的实现细节,简化编程过程访问控制私有保护公有可以公开:名字受保护的:财产绝对不能公开:秘密7.3.1Python实现封装151Python没有明确的访问控制符保护属性或方法:单下划线“_”开始,规范上约定不能直接使用(用了也不会报错)私有属性或方法:双下划线“__”开始,语法上不能直接使用(用了会报错)classDemo1:def__init__(self):self.__private_data=0

def__private_method(self):print('一个前置双下划线命名的私有方法')示例7-77.3.1Python实现封装151classCircle:definfo(self):print(self.__private_data)self.__private_method()d1=Demo1()print(d1.__private_data)#报错:AttributeErrord1.__private_method()#报错:AttributeError

print(d1._Demo1__private_data)d1._Demo1__private_method()示例7-77.3.1Python实现封装152前置单下划线命名保护的属性和方法classDemo2:def__init__(self):self._protected_data=0def_protected_method(self):print('一个前置单下划线命名的保护方法')definfo(self):print(self._protected_data)self._protected_method()d2=Demo2()print(d2._protected_data)d2._protected_method()示例7-87.3.2@property152通过实例方法get_r()和set_r()读写半径classCircle:def__init__(self):self.__r=Nonedefget_r(self):returnself.__rdefset_r(self,r):if(isinstance(r,int)orisinstance(r,float))andr>0:self.__r=relse:print('r必须是大于0的整数或浮点数.')示例7-97.3.2@property152通过实例方法get_r()和set_r()读写半径@property:定义对象属性访问器将一个实例方法伪装成实例属性简洁代码c1=Circle()c1.set_r(2.0)print(c1.get_r())#打印结果:2.0示例7-97.3.2@property153@property定义只读属性fromdatetimeimportdateclassPerson:def__init__(self,name,born):=nameself.born=born示例7-107.3.2@property153@property定义只读属性

@propertydefage(self):today=date.today()birthday=self.born.replace(year=today.year)ifbirthday>today:returntoday.year-self.born.year-1else:returntoday.year-self.born.yearp1=Person('',date(1990,5,15))print(p1.age)#打印结果:33示例7-107.3.2@property153@property定义读/写属性classCircle:def__init__(self):self.__r=None@propertydefr(self):returnself.__r示例7-117.3.2@property153@property定义读/写属性

@r.setterdefr(self,r):if(isinstance(r,int)orisinstance(r,float))andr>0:self.__r=relse:print('r必须是大于0的整数或浮点数.')c1=Circle()c1.r=2.0print(c1.r)#打印结果:2.0示例7-11Python类与对象01020403封装继承多态目

录继承0304多态目

录Python类与对象0102封装代码复用扩展新特性7.4.1代码复用161继承:从已有的类派生新的子类,子类完全继承父类的公有属性和公有方法实现代码复用,减少类之间代码冗余子类添加新属性/方法,灵活扩展生命值攻击值派生成长等级escape()派生攻击倾向Spirit类Pet类Monster类7.4.1代码复用继承语法class子类名(父类名):#子类实现7.4.1代码复用161Spirit类派生子类Pet和MonsterclassSpirit:def__init__(self,life=100,aggro=False):self.life=lifeself.current_life=lifeself.aggro=aggrodefis_live(self):returnFalseifself.current_life<=0elseTruedefis_aggro(self):returnself.aggro示例7-127.4.1代码复用161Spirit类派生子类Pet和MonsterclassPet(Spirit):passclassMonster(Spirit):passp1=Pet(100,True)#调用父类的__init__()m1=Monster(400,False)#调用父类的__init__()print(p1.life,p1.current_life,p1.aggro)print(m1.life,m1.current_life,m1.aggro)示例7-127.4.2扩展新特性161扩展新特性class子类名(父类名)子类类属性=值def__init__(self,参数列表):

#初始化继承的实例属性super().__init__(参数列表)

self.子类实例属性=值super():内置函数,用于调用父类的方法,此处调用确保父类中的初始化代码正确执行子类__init__()方法的参数列表常常要包含父类初始化所需的参数7.4.2扩展新特性162子类Monster添加新方法classMonster(Spirit):def__init__(self,life=100,aggro=False,exp=200):super().__init__(life,aggro)self.exp=expdefescape(self):p=random.randint(1,100)ifp<=40:print('逃跑成功!')self.current_life=self.lifeelse:print('逃跑失败!')示例7-137.4.2扩展新特性162子类Monster添加新方法

defcalc_damage(self,damage):self.current_life-=damageifself.current_life<=0:print('怪物被消灭!')elifself.current_life<100:print('触发逃跑事件!')self.escape()#调用Monster的__init__()m1=Monster(400,False,100)m1.calc_damage(320)#怪物受到320点伤害示例7-13Python类与对象01020403封装继承多态目

录多态04目

录Python类与对象0102封装03继承Python多态实现7.5多态163多态:继承体系中,不同子类对父类的同名方法表现出不同行为同一继承体系子类重新实现父类同名方法(不重写=用父类的)举例RPG游戏不同的游戏角色攻击计算方式有所不同在桌面应用程序中,按钮、下拉框、文本框等控件,

温馨提示

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

评论

0/150

提交评论