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

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.jianshu.com/p/f529923bab21
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞