Python面向对象编程——继承和多态流浪的Coder

在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Baseclass、Superclass)。

比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印:

classAnimal(object):defrun(self):print('Animalisrunning...')当我们需要编写Dog和Cat类时,就可以直接从Animal类继承:

classDog(Animal):passclassCat(Animal):pass对于Dog来说,Animal就是它的父类,对于Animal来说,Dog就是它的子类。Cat和Dog类似。

<继承的好处>

继承最大的好处是子类获得了父类的全部功能。由于Animial实现了run()方法,因此,Dog和Cat作为它的子类,什么事也没干,就自动拥有了run()方法:

dog=Dog()dog.run()cat=Cat()cat.run()运行结果如下:

Animalisrunning...Animalisrunning...也可以对子类增加一些方法,比如Dog类:

classDog(Animal):defrun(self):print('Dogisrunning...')defeat(self):print('Eatingmeat...')继承的第二个好处需要我们对代码做一点改进。你看到了,无论是Dog还是Cat,它们run()的时候,显示的都是Animalisrunning...,符合逻辑的做法是分别显示Dogisrunning...和Catisrunning...,因此,对Dog和Cat类改进如下:

classDog(Animal):defrun(self):print('Dogisrunning...')classCat(Animal):defrun(self):print('Catisrunning...')再次运行,结果如下:

Dogisrunning...Catisrunning...当子类和父类都存在相同的run()方法时,我们说,子类的run()覆盖了父类的run(),在代码运行的时候,总是会调用子类的run()。这样,我们就获得了继承的另一个好处:多态。

<什么是多态>

要理解什么是多态,我们首先要对数据类型再作一点说明。当我们定义一个class的时候,我们实际上就定义了一种数据类型。我们定义的数据类型和Python自带的数据类型,比如str、list、dict没什么两样:

a=list()#a是list类型b=Animal()#b是Animal类型c=Dog()#c是Dog类型判断一个变量是否是某个类型可以用isinstance()判断:

>>>isinstance(a,list)True>>>isinstance(b,Animal)True>>>isinstance(c,Dog)True看来a、b、c确实对应着list、Animal、Dog这3种类型。

神奇的是:

>>>isinstance(c,Animal)True看来c不仅仅是Dog,c还是Animal。

因为Dog是从Animal继承下来的,当我们创建了一个Dog的实例c时,我们认为c的数据类型是Dog没错,但c同时也是Animal也没错,Dog本来就是Animal的一种!所以,在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,反过来就不行:

>>>b=Animal()>>>isinstance(b,Dog)FalseDog可以看成Animal,但Animal不可以看成Dog。

要理解多态的好处,我们还需要再编写一个函数,这个函数接受一个Animal类型的变量:

defrun_twice(animal):animal.run()animal.run()当传入Animal的实例时,run_twice()就打印出:

>>>run_twice(Animal())Animalisrunning...Animalisrunning...当传入Dog的实例时,run_twice()就打印出:

>>>run_twice(Dog())Dogisrunning...Dogisrunning...当我们传入Cat的实例时,run_twice()就打印出:

>>>run_twice(Cat())Catisrunning...Catisrunning...现在,如果再定义一个Tortoise类型,也从Animal派生:

classTortoise(Animal):defrun(self):print('Tortoiseisrunningslowly...')当我们调用run_twice()时,传入Tortoise的实例:

>>>run_twice(Tortoise())Tortoiseisrunningslowly...Tortoiseisrunningslowly...会发现,新增一个Animal的子类,不必对run_twice()做任何修改,实际上,任何依赖Animal作为参数的函数或者方法都可以不加修改地正常运行,原因就在于多态。

多态的好处就是,当需要传入Dog、Cat、Tortoise……时,只需要接收Animal类型就可以了,因为Dog、Cat、Tortoise……都是Animal类型,然后,按照Animal类型进行操作即可。由于Animal类型有run()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的run()方法,这就是多态的意思:

对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心地调用run()方法,而具体调用的run()方法是作用在Animal、Dog、Cat还是Tortoise对象上,由运行时该对象的确切类型决定,这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保run()方法编写正确,不用管原来的代码是如何调用的。这就是著名的“开闭”原则:

对扩展开放:允许新增Animal子类;

对修改封闭:不需要修改依赖Animal类型的run_twice()等函数。

继承还可以一级一级地继承下来,就好比从爷爷到爸爸、再到儿子这样的关系。而任何类,最终都可以追溯到根类object,这些继承关系看上去就像一颗倒着的树。比如如下的继承树:

对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。

对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了:

classTimer(object):defrun(self):print('Start...')这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。

Python的“file-likeobject“就是一种鸭子类型。对真正的文件对象,它有一个read()方法,返回其内容。但是,许多对象,只要有read()方法,都被视为“file-likeobject“。许多函数接收的参数就是“file-likeobject“,不一定要传入真正的文件对象,完全可以传入任何实现了read()方法的对象。

继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。

动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的。

THE END
1.宾狗是什么梗抖音上许多好玩的视频经常会被网友拿来玩梗,近期就有一个“宾狗”的梗很火,许多人还不知道具体是什么意思?宾狗是什么梗呢?想知道的就跟随小编一起来看看吧。 宾狗是什么梗 1、这个梗出自于博主“nico爱肉包”拍摄的搞笑视频,因为这个魔性的口音还有充满喜感的动作让这声“bingo”十分的洗脑; 2、现在这个梗已经...http://m.qicaisi.com/bk-3652476.shtml/
2.canibeyourdog是什么意思什么梗can i be your dog是什么意思: 这个梗的含义是指粉丝对女神或女明星撒娇,表达对她们的喜欢和追捧,以及希望获得回应和关注的心情。 梗的起源是在韩国女团TWICE的直播中。有一次,周子瑜和Momo在直播时,有粉丝在弹幕上写道"momo, can i be your dog",意思是希望成为Momo的宠物或舔狗。Momo对此非常震惊,回答说"sor...https://www.jinghooo.com/definition/52120
3.dogandcat的翻译是:什么意思?中文翻译英文,英文翻译中文,怎么...匿名 关注:1 2013-05-23 12:21 求翻译:dog and cat是什么意思?待解决 悬赏分:1 - 离问题结束还有 dog and cat问题补充:匿名 2013-05-23 12:21:38 狗和猫 匿名 2013-05-23 12:23:18 狗和猫 匿名 2013-05-23 12:24:58 狗和猫 匿名 2013-05-23 12:26:38 猫和狗 匿名 2013...http://www.zaixian-fanyi.com/fan_yi_1015360
1.猫:你在狗叫什么?小鹿娱乐a 在得物App发布了一条热门动态!快来围观,就等你啦!https://m.dewu.com/note/trend/details?id=247699500
2.揭秘2017网络文化魅力,最新梗一网打尽电子产品2017年的网络文化中,梗以其独特的魅力吸引了大量年轻人的关注,它们反映了年轻人的生活态度和价值观,也体现了网络文化的独特魅力,梗的存在,丰富了网络文化的内容,为年轻人提供了更多的表达方式,梗的流行也反映了当代年轻人的社会心理,如追求轻松、幽默的生活方式,渴望展示个性和才华等,随着互联网的不断发展,我们有理...http://jinlinbg.cn/post/13759.html
3.黄子韬以为strong哥是强哥网络梗引发爆笑互动资讯头条黄子韬以为strong哥是强哥 网络梗引发爆笑互动 [摘要] 21日,徐艺洋与黄子韬同框直播。在直播中,黄子韬看到弹幕中的“strong哥”误以为是“强哥”,忍不住偷笑。徐艺洋解释说:“那是死装哥,说你死装的。”听到这个解释后,黄子韬的笑容瞬间消失。徐艺洋向黄子韬解释了网络用语“strong哥”的意思,但黄子韬仍然坚持认为这...https://www.syuan.com/shandong/article/zixuntoutiao/detail-225257.html
4.网络新词揭秘,狗托究竟何意?在现今的网络世界中,各种新鲜、有趣的网络用语层出不穷,狗托”一词更是引起了广大网友的关注和好奇,究竟何为“狗托”?就让我们一起来揭开这层神秘的面纱,探究一下“狗托”的真正含义。 “狗托”,顾名思义,这个词的构成中包含了“狗”和“托”两个元素。“狗”在这里并不是指我们日常生活中所见的四足动物...http://www.gdwsyj.com/zxgl/24819.html
5.www.fskl.com.cn/mokaka82243.html这次老戏骨主动提年龄梗是因为没提前打招呼,不过谋女郎反应挺快的,直接糊弄过去了。 打遍东南亚的男星在退圈后没少折腾,兜兜转转还得觉得娱乐圈的钱好挣。、.. 这件八尺大幅作于齐白石正式定居北京第三年(1922年),画家时年58岁,“胆敢独造”的山水初露面目。19世纪初年,齐白石六出六归,远游各地,探访名作,...http://www.fskl.com.cn/mokaka82243.html
6.catanddog是什么意思及反义词翻译catanddog的意思沪江词库精选cat-and-dog是什么意思、英语单词推荐 副词 吵吵闹闹的,不和的 相似短语 rain cat and dog v. 下倾盆大雨 cat and dog production 多规格生产杂乱生产 live like cat and dog 整天吵架 live a cat and dog life 整天吵架不和 dog it (在比赛, 演出, 工作中)吊儿郎当, 敷衍了事 ...https://www.hujiang.com/ciku/cat-and-dog/
7.曼谷宠物餐厅没有什么寂寞是萌宠解决不了的Dog in Town 位于Ekkamai小巷弄中的Dog in Town咖啡馆,是C姐最喜欢的一家宠物咖啡店了! 咖啡馆门前有一片大草坪,给客人们和汪星人足够的场地来一场奔跑约会! 这家咖啡馆有很多不同种类的大狗小狗,有短腿星人柯基、优雅的牧羊、法斗、 雪纳瑞、西高地白梗...还有阿拉斯加、大萨摩、哈士奇。可爱的是~店里面的...https://m.mafengwo.cn/gonglve/ziyouxing/121002.html
8.斗罗之开局签到混沌钟在警戒岗执勤的民警吕彦鑫发现了情况,带领组员前往查看,一边从中调解,一边为李先生一家五口人拍照、登记信息……不到7分钟,边境通行证电子照就传了过来。李先生一家紧锁的眉头舒展开来,对库地边境检查站便捷高效、热情周到的服务竖起大拇指。-- “银发经济产业链长、业态多元,市场潜力大。”北京市房山区委副书记...http://hnxingcan.com/birske5189189.htm
9.ak.akvtc.cn/mokohtml/cat8923?tags=vv6sbak.akvtc.cn/mokohtml/cat8923?tags=vv6sb 网上不是说他们已经分道扬镳了吗?可前几天,陈妍希在北京一家高大上的购物中心溜达时,左手无名指上的婚戒闪瞎了一众吃瓜群众的眼,这下子,大家又开始脑补各种剧情了。还有小道消息,说陈妍希给陈晓下了“最后通牒”:敢离?那就让全国人民都来看咱们家的笑话!http://ak.akvtc.cn/mokohtml/cat8923?tags=vv6sb
10.www.fanxueer.com/mokaka77366.html《白夜破晓》作为《白夜追凶》的续篇,其问世本身就承载着无数观众的期待与厚望。七年,对于一个系列作品而言,是时间的考验,也是品质的磨砺。在这漫长的等待中,国产悬疑剧市场风云变幻,新作辈出,但《白夜破晓》的回归,却如同一股清流,以其独特的魅力,瞬间吸引了所有目光。 http://www.fanxueer.com/mokaka77366.html
11.《流人》口语笔记这些英文都是什么神仙用法(流人第一季)剧评实际上Slow Horses意为放慢速度的马,而“流人”这个翻译借用了古语,指被流放在外地的人,寓意非常契合该剧Slough House情报员的处境。此外,我一边看剧,一边总结了以下这些实用的口语表达,分享给大家~1 dog 特工在战争时期,有不少间谍狗或者特工狗的出现,所以dog在这里被用来指代特工就不足为奇了,毕竟是部妥妥的...https://movie.douban.com/review/14321589/
12.www.sjys66.com/mokaka91603.html按照计划,该生产线将在2025年1月正式启用,届时将推进电芯规格的开发,并针对量产技术和成本进行详细验证。 本田设定了宏伟的环境目标,即到2050年实现全领域产品和企业活动的碳中和,以及到2040年实现纯电动车和燃料电池车在全球销售的占比达到100%。http://www.sjys66.com/mokaka91603.html
13.DogMan#4:DogManandCatKidCat Kid Comic Club #1 Dog Man #1: Dog Man Dog Man #8: Fetch-22 Dog Man #9: Grime and Punishment Dog Man #6: Brawl of The Wild Dog Man 7 For Whom the Ball Rolls Dog Man #3: A Tale of Two Kitties Dog Man #5: Lord of the Fleas ...https://m.xiaohuasheng.cn/book/75c87e9a2c773e6
14.catdog中文,catdog是什麼意思catdog的中文翻譯 發音:dalek sg|貓狗 貓狗 相关词汇 catchplay: 威望國際 catch-22: 第22條軍規 cate blanchett: 凱特·布蘭切特 catch the ghost: 抓住幽靈 catenaccio: 鏈式防守 catch me now: 原來愛上賊 catenanuova: 卡泰納諾瓦 catenoy: 卡特努瓦...https://tw.ichacha.net/mid/catdog.html
15.丢脸丢大了,原来oldcat不是老猫的意思…myOffer?那老猫真不是用old cat说吗?也不是,在前面加不定冠词或量词是可以表示老猫的,比如one old cat或an old cat。 old dog 这个短语的字面意思和old cat有异曲同工的意思,千万不要以为是字面意思老狗,old dog也是一句很地道的英语俚语, 它的意思是“上了岁数的人,老手,老家伙”,而且这个短语是带有贬义。 如果...https://m.myoffer.cn/article/45365.html