版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《红楼梦》菊花诗鉴赏-部编版2019下册语文课件
- 小学班主任资料-数学-教学总结4
- 《孙权劝学》课后习题参考答案
- 农产品追溯与物流智能化管理方案
- 四级筑路工(中级)职业技能鉴定考试题库(含答案)
- AbMole模块化刺激响应水凝胶:开启胃肠道渗漏防治新篇章
- 2024年中国打印机市场探析:数字化浪潮智能引领打印机市场-18正式版
- 七年级英语上册第01讲 be动词和行为动词的一般现在时(原卷版)
- 窗帘采购投标方案(技术方案)
- 2024年重庆市消防设施操作员《基础知识》科目真题冲刺卷下半年A卷
- 【川教版】《生命.生态.安全》五年级上册第9课《我健康吗》课件
- 【川教版】《生命 生态 安全》三年级上册第2课《老鼠爱大米》课件
- 水泵维保方案
- 汽车驾驶员初级工考试考试题(题库版)
- 2024年湖北武汉光迅科技股份有限公司招聘笔试参考题库含答案解析
- 北京海淀十一学校2024届语文八年级第二学期期末统考模拟试题含解析
- 铜膏行业前景分析
- 慢阻肺疑难护理病例讨论
- 农资购销策划方案
- 汽车抵押贷款计划书
- 2024年医疗健康科技的创新模式
评论
0/150
提交评论