【第九天】Python的子类与属性覆盖

作者: 人生苦短_我用Python | 来源:发表于2018-03-21 22:04 被阅读12次

    4.2

    1. 子类

    类别本身还可以进一步细化成子类,比如,鸟类可以进一步分成鸡,天鹅
    在面向对象编程中,我们通过继承(Inheritance)来表达上述概念

    class Bird(object):
        feather = True
        reproduction = 'egg'
        def chirp(self,sound):
            print(sound)
    class Chicken(Bird):
        how_to_move = 'walk'
        edible = True
    class Swan(Bird):
        how_to_move = 'swim'
        edible = False
    summer = Chicken()
    print(summer.feather)
    summer.chirp('ji')
    print(summer.how_to_move)
    
    True
    ji
    walk
    

    新定义的鸡(Chicken)类,增加了两个属性:移动方式(how_to_move)
    和可以食用(edible)

    在类定义时,括号里为Bird,这说明,鸡类是属于鸟类(Bird)的一个子类
    即Chicken继承自Bird,子类Chicken将享有父类Bird的所有属性

    2.属性覆盖

    如上所述,在继承的过程中,我们可以在子类中增加父类不存在的属性,从而增强子类的功能
    此外,我们还可以在子类中替换父类已经存在了的属性,如:

    class Bird(object):
        def chirp(self):
            print('make sound')
    class Chicken(Bird):
        def chirp(self):
            print('ji')
    bird = Bird()
    bird.chirp()
    summer = Chicken()
    summer.chirp()
    
    make sound
    ji
    

    鸡类(Chicken)是鸟类(Bird)的子类,在鸡类(Chicken)中
    我们定义了方法chirp(),这个方法在鸟类中也有定义
    通过调用可以看出,鸡类会调用自己定义的chirp()方法
    而不是父类中的chirp()方法,从效果上看,就好像父类中的方法
    被子类中的同名属性覆盖(override)了一样

    通过对方法的覆盖,我们可以彻底改变子类的行为,但有的时候
    子类的行为是对父类行为的拓展,这时,我们可以通过super关键字
    在子类中调用父类中被覆盖的方法,比如:

    class Bird(object):
        def chirp(self):
            print('make sound')
    class Chicken(Bird):
        def chirp(self):
            super().chirp()
            print('ji')
    bird = Bird()
    bird.chirp()
    summer = Chicken()
    summer.chirp()
    
    make sound
    make sound
    ji
    

    在鸡类的chirp()方法中,我们使用了super,它是一个内置类
    能产生一个指代父类的对象,通过super,我们在子类的同名方法中调用了父类的方法
    这样,子类的方法既能执行父类中的相关操作,又能定义属于自己的额外操作

    调用super的语句可以出现在子类方法的第一句
    也可以出现在子类方法的任意其他位置

    相关文章

      网友评论

        本文标题:【第九天】Python的子类与属性覆盖

        本文链接:https://www.haomeiwen.com/subject/pbwnqftx.html