廖雪峰Python3教程疑难理解(4):继承、多态、改写,顺便用一下super()

获取更多文章和更新,请关注我的个人主页:https://leiting6.cn

很多跟我一样只有一点C语言基础的朋友,在学习如Python、Java这样的面向对象的语言的时候,走到继承这一步总会觉得非常生涩难懂。其实廖老师这一节将的非常生动详细,结合网上一些博客文章,也能有一个不错的理解。

面向对象语言的典型特征就是可以创建一个类,并且其他的类可以作为子类继承父类的内容。网上好多例子都是以Person、Father、Student、Animal为素材来讲的,甚至于有一些丧心病狂的直接用class A、class B,类里面的一些方法比如学生走路啊、小狗奔跑之类,太过于简单导致抽象,看起来枯燥难懂。

小小吐槽一下。我自己举的例子,也还是以Animal作为素材,不过尽量在内部方法上把内容做丰富一些,让其实现的功能和参数关联程度高一点,不至于太抽象。代码如下(对代码就不做多少分析了,注释写的比较详细,实际结构很简单):

# -*- coding: utf-8 -*-

class Animal():
    '''
    Animal类初始化方法,创建2个基本属性,name和age
    '''
    def __init__(self, name, age):  # self参数自动传入,name和age需要手动传入
        self.name = name            # 带有self.表明是Animal类自己的参数
        self.age = age              # 赋值操作,将外部传入的数值赋值给Animal类的参数
        
    '''
    Animal类中的一个功能方法:打招呼
    该功能函数用到了上面初始化过程中创建的2个参数
    '''    
    def say_hello(self):
        print('嗨,你们好,我的名字是%s,我今年%d岁了.' % (self.name, self.age))
        
    '''
    Animal类的另一个功能方法:显示心情
    '''
    def show_mood(self, mood):
        print('%s今天看起来很%s!' % (self.name, mood))
        
class Dog(Animal):
    '''
    新建Dog类,继承Animal类
    和上面差不多,Dog类的初始化方法
    不同的是,name和age参数在父类中已经初始化过
    因此在子类Dog中没必要在重复赋值语句
    所以用super(),保证相同的参数只初始化一次
    '''
    def __init__(self, name, age, color):       # 要注意的是,需要用到的形参还是要一一列出
        super(Dog, self).__init__(name, age)    # 没必要二次赋值的参数用super来继承
        self.color = color                      # 新增的参数需要编写新的赋值语句
    
    '''
    这是一个已经改写的方法
    相比较于父类中的say_hello方法,这里打招呼的内容增加了毛色的描述
    '''
    def say_hello(self):
        print('嗨,你们好,我的名字是%s,我今年%d岁了,我的毛色是%s。' % (self.name, self.age, self.color))
        
if __name__ == '__main__':
    # Dog继承Animal,则my_dog是多态的,即使Dog类型,也是Animal类型
    my_dog = Dog('Coba', 15, '黄色')
    # my_dog调用了say_hello方法,由于在子类Dog中这个方法已经改写,所以打印的结果是改写后的内容
    my_dog.say_hello()
    # show_mood方法没有改写,所以直接调用父类Animal中对应的方法
    my_dog.show_mood('开心')

代码打印的结果:

D:\Python\廖雪峰教程\继承和多态>python 1.py
嗨,你们好,我的名字是Coba,我今年15岁了,我的毛色是黄色。
Coba今天看起来很开心!

我自己写的例子里,只有一个父类Animal、一个子类Dog以及一个实例my_dog;父类中的方法,有在子类中改写的,有没有改写的;实例my_dog自然具有多态特征,在调用类中方法的时候,无需考虑方法是在哪里创建的、是否被改写,一切遵循“开闭”原则。

这里的super只是用来继承父类Animal中的赋值语句,属于很简单的应用;其实super更大的意义在于类的多重继承,这个以后自己理解更透彻了再举例说明,网上一堆class ABCDEFG看的头疼...

不知道大家看到这个例子有没有对Python的面向对象属性理解更清晰,反正如果我是初学者,我是更希望看到这样的例子的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,640评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,254评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,011评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,755评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,774评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,610评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,352评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,257评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,717评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,894评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,021评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,735评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,354评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,936评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,054评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,224评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,974评论 2 355

推荐阅读更多精彩内容

  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,057评论 0 4
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 1,227评论 0 2
  • 2014年的苹果全球开发者大会(WWDC),当Craig Federighi向全世界宣布“We have new ...
    yeshenlong520阅读 2,294评论 0 9
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,639评论 18 399
  • 不知道从什么时候开始,“鸡汤”变成了一个有毒的标签,好好的正能量的东西,不知怎么在口口相传中,带上了毒性? 鸡汤嘛...
    秉笔春秋吕书生阅读 265评论 8 10