獲取更多文章和更新宋税,請(qǐng)關(guān)注我的個(gè)人主頁(yè):https://leiting6.cn
很多跟我一樣只有一點(diǎn)C語(yǔ)言基礎(chǔ)的朋友,在學(xué)習(xí)如Python讼油、Java這樣的面向?qū)ο蟮恼Z(yǔ)言的時(shí)候杰赛,走到繼承這一步總會(huì)覺(jué)得非常生澀難懂。其實(shí)廖老師這一節(jié)將的非常生動(dòng)詳細(xì)矮台,結(jié)合網(wǎng)上一些博客文章乏屯,也能有一個(gè)不錯(cuò)的理解。
面向?qū)ο笳Z(yǔ)言的典型特征就是可以創(chuàng)建一個(gè)類(lèi)瘦赫,并且其他的類(lèi)可以作為子類(lèi)繼承父類(lèi)的內(nèi)容辰晕。網(wǎng)上好多例子都是以Person、Father确虱、Student含友、Animal為素材來(lái)講的,甚至于有一些喪心病狂的直接用class A校辩、class B窘问,類(lèi)里面的一些方法比如學(xué)生走路啊、小狗奔跑之類(lèi)召川,太過(guò)于簡(jiǎn)單導(dǎo)致抽象南缓,看起來(lái)枯燥難懂。
小小吐槽一下荧呐。我自己舉的例子汉形,也還是以Animal作為素材,不過(guò)盡量在內(nèi)部方法上把內(nèi)容做豐富一些倍阐,讓其實(shí)現(xiàn)的功能和參數(shù)關(guān)聯(lián)程度高一點(diǎn)概疆,不至于太抽象。代碼如下(對(duì)代碼就不做多少分析了峰搪,注釋寫(xiě)的比較詳細(xì)岔冀,實(shí)際結(jié)構(gòu)很簡(jiǎn)單):
# -*- coding: utf-8 -*-
class Animal():
'''
Animal類(lèi)初始化方法,創(chuàng)建2個(gè)基本屬性概耻,name和age
'''
def __init__(self, name, age): # self參數(shù)自動(dòng)傳入使套,name和age需要手動(dòng)傳入
self.name = name # 帶有self.表明是Animal類(lèi)自己的參數(shù)
self.age = age # 賦值操作,將外部傳入的數(shù)值賦值給Animal類(lèi)的參數(shù)
'''
Animal類(lèi)中的一個(gè)功能方法:打招呼
該功能函數(shù)用到了上面初始化過(guò)程中創(chuàng)建的2個(gè)參數(shù)
'''
def say_hello(self):
print('嗨鞠柄,你們好侦高,我的名字是%s,我今年%d歲了.' % (self.name, self.age))
'''
Animal類(lèi)的另一個(gè)功能方法:顯示心情
'''
def show_mood(self, mood):
print('%s今天看起來(lái)很%s!' % (self.name, mood))
class Dog(Animal):
'''
新建Dog類(lèi)厌杜,繼承Animal類(lèi)
和上面差不多奉呛,Dog類(lèi)的初始化方法
不同的是计螺,name和age參數(shù)在父類(lèi)中已經(jīng)初始化過(guò)
因此在子類(lèi)Dog中沒(méi)必要在重復(fù)賦值語(yǔ)句
所以用super(),保證相同的參數(shù)只初始化一次
'''
def __init__(self, name, age, color): # 要注意的是瞧壮,需要用到的形參還是要一一列出
super(Dog, self).__init__(name, age) # 沒(méi)必要二次賦值的參數(shù)用super來(lái)繼承
self.color = color # 新增的參數(shù)需要編寫(xiě)新的賦值語(yǔ)句
'''
這是一個(gè)已經(jīng)改寫(xiě)的方法
相比較于父類(lèi)中的say_hello方法登馒,這里打招呼的內(nèi)容增加了毛色的描述
'''
def say_hello(self):
print('嗨,你們好咆槽,我的名字是%s陈轿,我今年%d歲了,我的毛色是%s罗晕。' % (self.name, self.age, self.color))
if __name__ == '__main__':
# Dog繼承Animal济欢,則my_dog是多態(tài)的,即使Dog類(lèi)型小渊,也是Animal類(lèi)型
my_dog = Dog('Coba', 15, '黃色')
# my_dog調(diào)用了say_hello方法,由于在子類(lèi)Dog中這個(gè)方法已經(jīng)改寫(xiě)茫叭,所以打印的結(jié)果是改寫(xiě)后的內(nèi)容
my_dog.say_hello()
# show_mood方法沒(méi)有改寫(xiě)酬屉,所以直接調(diào)用父類(lèi)Animal中對(duì)應(yīng)的方法
my_dog.show_mood('開(kāi)心')
代碼打印的結(jié)果:
D:\Python\廖雪峰教程\繼承和多態(tài)>python 1.py
嗨,你們好揍愁,我的名字是Coba呐萨,我今年15歲了,我的毛色是黃色莽囤。
Coba今天看起來(lái)很開(kāi)心!
我自己寫(xiě)的例子里谬擦,只有一個(gè)父類(lèi)Animal、一個(gè)子類(lèi)Dog以及一個(gè)實(shí)例my_dog朽缎;父類(lèi)中的方法惨远,有在子類(lèi)中改寫(xiě)的,有沒(méi)有改寫(xiě)的话肖;實(shí)例my_dog自然具有多態(tài)特征北秽,在調(diào)用類(lèi)中方法的時(shí)候,無(wú)需考慮方法是在哪里創(chuàng)建的最筒、是否被改寫(xiě)贺氓,一切遵循“開(kāi)閉”原則。
這里的super只是用來(lái)繼承父類(lèi)Animal中的賦值語(yǔ)句床蜘,屬于很簡(jiǎn)單的應(yīng)用辙培;其實(shí)super更大的意義在于類(lèi)的多重繼承,這個(gè)以后自己理解更透徹了再舉例說(shuō)明邢锯,網(wǎng)上一堆class ABCDEFG看的頭疼...
不知道大家看到這個(gè)例子有沒(méi)有對(duì)Python的面向?qū)ο髮傩岳斫飧逦锶铮凑绻沂浅鯇W(xué)者,我是更希望看到這樣的例子的弹囚。