小学课后服务 Python少儿编程 进阶篇:9-面向对象编程进阶 课件_第1页
小学课后服务 Python少儿编程 进阶篇:9-面向对象编程进阶 课件_第2页
小学课后服务 Python少儿编程 进阶篇:9-面向对象编程进阶 课件_第3页
小学课后服务 Python少儿编程 进阶篇:9-面向对象编程进阶 课件_第4页
小学课后服务 Python少儿编程 进阶篇:9-面向对象编程进阶 课件_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

Loremipsumdolorsitamet,consectetueradipiscingelit.Aeneancommodoligulaegetdolor.Cumsociisnatoquepenatibusetmagnisdisparturientmontes,nasceturridiculusmus.少儿编程课面向对象编程进阶这一节,我们学习面向对象的三大特征:封装、继承和多态封装继承多态面向对象三大特征之封装什么是封装呢?我们用前面Orc类来说:classOrc:

def__init__(self,name,hp,lv):

self.name=name

self.hp=hp

self.lv=lv

defdesc(self):

print('我是%s,血量为:%s,等级为:%s'%(self.name,self.hp,self.lv))

orc=Orc('史瑞克',200,2)

orc.desc()

在面向对象的编程思想中,将属性和方法隐藏在类中的行为,就称为封装。属性和方法通过对象调用,对于调用者来说,隐藏了具体的实现细节。封装除了隐藏细节外,还有另一个目的:数据的安全就像机箱的目的是为了保护电脑内部的主板、硬盘、处理器、电源等那么对于当前的Orc类来说,如何保证内部属性数据的安全呢?classOrc:

def__init__(self,name,hp,lv):

self.name=name

self.hp=hp

self.lv=lv

defdesc(self):

print('我是%s,血量为:%s,等级为:%s'%(self.name,self.hp,self.lv))

orc=Orc('史瑞克',200,2)#语法上没问题,但是不符合实际情况!

orc.hp=-200

orc.desc()

这就好比,如何能保证电脑内部硬盘的安全,同时又能够让外部能够访问到硬盘对于电脑来说是机箱+USB接口,对于类来说,是私有+getter/setter1属性前加上__,就变成了了私有属性classOrc:

def__init__(self,name,hp,lv):

self.__name=name

self.__hp=hp

self.__lv=lv

defdesc(self):

print('我是%s,血量为:%s,等级为:%s'%

(self.__name,self.__hp,self.__lv))

orc=Orc('史瑞克',200,2)

orc.desc()#此时打印,会报错

print(orc.__hp)Traceback(mostrecentcalllast):File"C:/…/demo01.py",line13,in<module>print(orc.__hp)AttributeError:'Orc'objecthasnoattribute'__hp'此时运行(类外部访问),就会报错2外部如何访问属性呢?比如获取当前的血量classOrc:

def__init__(self,name,hp,lv):

self.__name=name

self.__hp=hp

self.__lv=lv

defdesc(self):

print(‘我是%s,血量为:%s,等级为:%s’%

(self.__name,self.__hp,self.__lv))

#get方法

defget_hp(self):

returnself.__hp

orc=Orc('史瑞克',200,2)

orc.desc()#get方法的使用

print(orc.get_hp())这就是所谓的属性的getter方法那又该如何在外部修改属性的值呢?比如血量减少之后hp的重新赋值3这就是和getter对应的setter方法,类定义如下:外部访问过程如下:classOrc:

def__init__(self,name,hp,lv):

self.__name=name

self.__hp=hp

self.__lv=lv

defdesc(self):

print('我是%s,血量为:%s,等级为:%s'%

(self.__name,self.__hp,self.__lv))

defget_hp(self):

returnself.__hp

defset_hp(self,hp):

self.__hp=hp

orc=Orc('史瑞克',200,2)

orc.desc()

#模拟orc这个对象减少了50点血

orc.set_hp(150)

orc.desc()

print(orc.get_hp())我是史瑞克,血量为:200,等级为:2我是史瑞克,血量为:150,等级为:2150输出结果为:思考:使用私有+getter/setter为什么解决数据安全的问题?为什么说私有+getter/setter就解决了数据的安全(脏数据)问题呢?关键在setter方法上,在该方法中,我们可以做任何的处理,比如对hp小于0的赋值都置为0:classOrc:

……

defset_hp(self,hp):

ifhp<0:

self.__hp=0

else:

self.__hp=hp

orc=Orc('史瑞克',200,2)

orc.desc()

#模拟orc这个对象减少了50点血

orc.set_hp(-150)

orc.desc()

print(orc.get_hp())

我是史瑞克,血量为:200,等级为:2我是史瑞克,血量为:0,等级为:20运行结果为:三大特征之继承现在假设我们做一个学校管理系统,那么就可能会要新建两个类1教师类,属性有:姓名、年龄、职位等2学生类,属性有:姓名、年龄、专业等classTeacher:

def__init__(self,name,age,position):

self.__name=name

self.__age=age

self.__position=position

defdesc(self):

print('大家好,我是一名教师,'

'我叫%s,今年%s岁,目前职位为:%s'%

(self.__name,self.__age,self.__position))

defget_name(self):

returnself.__name

defget_age(self):

returnself.__age

defget_position(self):

returnself.__position

defset_name(self,name):

self.__name=name

defset_age(self,age):

self.__age=age

defset_position(self,position):

self.__position=positionclassStudent:

def__init__(self,name,age,major):

self.__name=name

self.__age=age

self.__major=major

defdesc(self):

print('大家好,我是一名学生,'

'我叫%s,今年%s岁,在读专业为:%s'%

(self.__name,self.__age,self.__major))

defget_name(self):

returnself.__name

defget_age(self):

returnself.__age

defget_major(self):

returnself.__major

defset_name(self,name):

self.__name=name

defset_age(self,age):

self.__age=age

defset_major(self,major):

self.__major=major可以发现这两个类中有很多重复的地方,比如name和age属性及其get/set方法agenameposition教师类agenamemajor学生类agenamepositionmajor教师类学生类把共同部分提取出来这样有什么好处呢?代码进行了复用!agenamepositionmajoragenameposition教师类agenamemajor学生类agenamedept后勤人员类dept父类子类实际子类下面我们来看下Python中继承的写法,还以教师类和学生类来说:1定义父类,包含name和age属性2定义Teacher类,继承Person类classPerson:

def__init__(self,name,age):

self.__name=name

self.__age=age

defdesc(self):

print('我是父类,姓名:%s,年龄:%s'%(self.__name,self.__age))

classTeacher(Person):

def__init__(self,name,age,position): #super():用于调用父类的方法

super().__init__(name,age)

self.__position=position

teacher=Teacher('张三',20,'aaa')

teacher.desc()这样,属性和方法都继承了过来练习Exercises密封线内不准答题编写Student类,继承自Person类三大特征之多态现在,我们用上一步的Person、Teacher和Student来看下什么是多态2使用teacher对象调用desc(),1在Person中提供name和age的getter/setterclassTeacher(Person):

def__init__(self,name,age,position): #super():用于调用父类的方法

super().__init__(name,age)

self.__position=position

teacher=Teacher('张三',20,'aaa')

teacher.desc()这样输出的是父类的desc()3在Teacher类中添加desc方法,类似如下:defdesc(self):

print('我是一名教师,名字:'

'%s,年龄:%s,职位:%s'

%(super().get_name(),super().get_age(),self.__position))练习Exercises密封线内不准答题添加Student类中的desc()方法,注意super()的使用!现在,让我们再次来运行teacher或student对象的desc()方法,以teacher为例:代码为:teacher=Teacher('张三',20,'教研组长')

teacher.desc()运行结果为:我是一名教师,名字:张三,年龄:20,职位:教研组长也即是说,子类的desc方法覆盖了父类的desc方法,当调用的时候,调用的是子类的方法,这就叫多态这个该如何去理解呢?举个例子,下面的图片,都是鸟用面向对象的思想来看

温馨提示

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

评论

0/150

提交评论