获取更多文章和更新,请关注我的个人主页: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的面向对象属性理解更清晰,反正如果我是初学者,我是更希望看到这样的例子的。
网友评论