廖雪峰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的面向对象属性理解更清晰,反正如果我是初学者,我是更希望看到这样的例子的。

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