【python系统学习14】类的继承与创新
目錄:
- 目錄:
[toc]
- 類(lèi)的繼承
- 子類(lèi)和父類(lèi)
- 繼承的寫(xiě)法
- 繼承示例
- 父類(lèi)可以被無(wú)限個(gè)子類(lèi)所繼承
- 子類(lèi)實(shí)例可調(diào)用父類(lèi)屬性和方法
- 類(lèi)的始祖(根類(lèi))
- 根類(lèi) - object
- 實(shí)例歸屬判斷 - isinstance()
- 類(lèi)的繼承升級(jí)版 - 多層繼承
- 1、啥是多層繼承
- 2、偽代碼
- 3、示例代碼
- 4、多層繼承的好處
- 類(lèi)的繼承升級(jí)版 - 多重繼承
- 1、啥是多重繼承
- 2、就近繼承
- 3、爸爸近還是爺爺近
- 4、多重繼承的示例
- 5、多重繼承的作用
- 多層繼承和多重繼承
- 二者的比較
- 二者的結(jié)合
- 類(lèi)的創(chuàng)新
- 創(chuàng)新 - 新增代碼
- 創(chuàng)新 - 修改(重寫(xiě))繼承的內(nèi)容
- 優(yōu)雅的重寫(xiě)
- 目錄:
[toc] - 類(lèi)的繼承
- 子類(lèi)和父類(lèi)
- 繼承的寫(xiě)法
- 繼承示例
- 父類(lèi)可以被無(wú)限個(gè)子類(lèi)所繼承
- 子類(lèi)實(shí)例可調(diào)用父類(lèi)屬性和方法
- 類(lèi)的始祖(根類(lèi))
- 根類(lèi) - object
- 實(shí)例歸屬判斷 - isinstance()
- 類(lèi)的繼承升級(jí)版 - 多層繼承
- 1、啥是多層繼承
- 2、偽代碼
- 3、示例代碼
- 4、多層繼承的好處
- 類(lèi)的繼承升級(jí)版 - 多重繼承
- 1、啥是多重繼承
- 2、就近繼承
- 3、爸爸近還是爺爺近
- 4、多重繼承的示例
- 5、多重繼承的作用
- 多層繼承和多重繼承
- 二者的比較
- 二者的結(jié)合
- 類(lèi)的創(chuàng)新
- 創(chuàng)新 - 新增代碼
- 創(chuàng)新 - 修改(重寫(xiě))繼承的內(nèi)容
- 優(yōu)雅的重寫(xiě)
初中學(xué)政治我們就學(xué)到過(guò),要繼承中華民族的優(yōu)秀文化、又要在繼承的基礎(chǔ)上創(chuàng)新。
文化是在不斷繼承和創(chuàng)新中發(fā)展的,代碼也是。
我們可以用類(lèi)特有的繼承方法和拓展創(chuàng)新功能,實(shí)現(xiàn)代碼層面的前進(jìn)。
此節(jié)這兩個(gè)知識(shí)點(diǎn)屬于類(lèi)中較高階的操作,讓用類(lèi)寫(xiě)成的代碼更容易復(fù)用、拓展和維護(hù)。
類(lèi)的繼承
說(shuō)道“繼承”這倆字,你能想到啥?
反正我想到的是,兒子繼承老子的姓氏籍貫特征和遺產(chǎn)等。
放到代碼里,就是子類(lèi)繼承父類(lèi)的屬性和方法。
也就是說(shuō),通過(guò)類(lèi)的繼承,可以讓子類(lèi)擁有父類(lèi)擁有的所有屬性和方法。
這樣,很多基礎(chǔ)代碼不用再重復(fù)書(shū)寫(xiě),就可以直接實(shí)現(xiàn)代碼的復(fù)用
子類(lèi)和父類(lèi)
那之前只了解到類(lèi)的概念,怎么又多出來(lái)一個(gè)“子類(lèi)”和“父類(lèi)”的區(qū)分呢?
我想,這只是統(tǒng)稱(chēng)。凡是一個(gè)類(lèi)A繼承了另一個(gè)類(lèi)B,那么A就是B的兒子,A就可以統(tǒng)稱(chēng)為子類(lèi),B就可以統(tǒng)稱(chēng)為父類(lèi)。
題外話,我現(xiàn)在看這個(gè)“類(lèi)”字看多了,咋看咋像“糞”。。。
繼承的寫(xiě)法
偽代碼
class A(B):
...子類(lèi)A的創(chuàng)新定制代碼 # 下詳
注意:
A就是子類(lèi),B就是父類(lèi) 子類(lèi)繼承父類(lèi)時(shí),只需要子類(lèi)右邊的小括號(hào)內(nèi)部寫(xiě)父類(lèi)的類(lèi)名即可。 小括號(hào)和冒號(hào)都是英文格式
繼承示例
還是以老子和兒子的身份,編寫(xiě)兩段語(yǔ)義化的代碼來(lái)了解下:
# 子類(lèi)Son繼承父類(lèi)Father的示意
class Father:
familyName = '郭'
nativePlace = '河北省'
def language(self):
print('說(shuō)中國(guó)話')
class Son(Father): # 子類(lèi)Son繼承父類(lèi)Father的寫(xiě)法
def __init__(self, name):
self.name = name
def secondLanguage(self):
self.language()
print('學(xué)說(shuō)了英語(yǔ)')
父類(lèi)可以被無(wú)限個(gè)子類(lèi)所繼承
不是一個(gè)Son類(lèi)可以繼承Father,再來(lái)十個(gè)Son也可以。
class Father:
familyName = '郭' # 表示姓氏
nativePlace = '河北省' # 表示籍貫
def language(self): # 表示說(shuō)母語(yǔ)的能力
print('說(shuō)中國(guó)話')
class Son(Father): # 子類(lèi)Son繼承父類(lèi)Father
def __init__(self, name):
self.name = name
def secondLanguage(self):
self.language()
print('學(xué)說(shuō)了英語(yǔ)')
# 父類(lèi)可以被無(wú)限個(gè)子類(lèi)所繼承
class Son2(Father): # 子類(lèi)Son2繼承父類(lèi)Father
def __init__(self):
print('這里自己想象點(diǎn)Son2特色的代碼吧,我絞盡腦汁了~')
def characterFn(self):
self.language()
pass
class SonN(Father):
pass
# ...
子類(lèi)實(shí)例可調(diào)用父類(lèi)屬性和方法
子類(lèi)繼承來(lái)的屬性和方法,也會(huì)傳遞給子類(lèi)創(chuàng)建的實(shí)例。
這很好理解,子類(lèi)繼承父類(lèi)的屬性和方法,相當(dāng)于子類(lèi)外掛了父類(lèi)的屬性和方法。那么子類(lèi)的實(shí)例,也就可以用這些屬性和方法。
看個(gè)例子:
class Father:
familyName = '郭' # 表示姓氏
nativePlace = '河北省' # 表示籍貫
def language(self): # 表示說(shuō)母語(yǔ)的能力
print('說(shuō)中國(guó)話')
class Son(Father): # 子類(lèi)Son繼承父類(lèi)Father
def __init__(self, name):
self.name = name
def secondLanguage(self):
self.language()
print('學(xué)說(shuō)了英語(yǔ)')
son1 = Son('小菊')
print(son1.name + '姓' + son1.familyName)
print(son1.name + '籍貫是' + son1.nativePlace)
# 打印結(jié)果:
# 小菊姓郭
# 小菊籍貫是河北省
實(shí)例化后的對(duì)象son1不僅有類(lèi)Son內(nèi)部定義的屬性,還有父類(lèi)Father內(nèi)部定義的屬性familyName、nativePlace等。
說(shuō)明子類(lèi)創(chuàng)建的實(shí)例,從子類(lèi)那間接得到了父類(lèi)的所有屬性和方法,實(shí)例化對(duì)象可以隨便運(yùn)用。
類(lèi)的始祖(根類(lèi))
根類(lèi) - object
在上邊類(lèi)的繼承中,我們協(xié)議子類(lèi)是Son、父類(lèi)是Father。
那Father還有他的父類(lèi)嗎?
答案是有的,那就是object。
object是所有類(lèi)的父類(lèi),我們將其稱(chēng)為根類(lèi)(可理解為類(lèi)的始祖)。
上述代碼中,class Father:相當(dāng)于寫(xiě)成class Father(object)
用isinstance來(lái)判斷說(shuō)明:
實(shí)例歸屬判斷 - isinstance()
函數(shù)isinstance(),可以用來(lái)判斷某個(gè)實(shí)例是否屬于某個(gè)類(lèi)。
觀察代碼看用法:
# 實(shí)例歸屬判斷 isinstance()
class Father:
pass
class Son(Father):
pass
class Son2:
pass
son1 = Son()
print(1,isinstance(son1,Son)) # True
# 說(shuō)明:子類(lèi)創(chuàng)建的實(shí)例屬于子類(lèi)(廢話。。。)
print(2,isinstance(son1,Father)) # True
# 說(shuō)明:子類(lèi)創(chuàng)建的實(shí)例同時(shí)也屬于父類(lèi)
print(3,isinstance(son1,object)) # True
# 說(shuō)明:說(shuō)明任何類(lèi)創(chuàng)建的實(shí)例都屬于根類(lèi)object
print(4,isinstance(son1,(Son,Father))) # True
# 說(shuō)明:son1屬于Son的實(shí)例、也屬于Father的實(shí)例
print(4,isinstance(son1,(Father,Son))) # True
# 說(shuō)明:son1屬于Son的實(shí)例、也屬于Father的實(shí)例
print(5,isinstance(son1,Son2)) # False
# 說(shuō)明:son1不是Son2的實(shí)例。A子類(lèi)創(chuàng)建的實(shí)例不屬于C子類(lèi)
print(6,isinstance(Son,Father)) # False
# 說(shuō)明:這倆都是類(lèi)所以報(bào)錯(cuò)。
print(7,isinstance(Son,object)) # True
# 說(shuō)明:可以說(shuō)明Son(任何類(lèi))是根類(lèi)object的實(shí)例
print(8,isinstance(Father,object)) # True
# 說(shuō)明:可以說(shuō)明Father(任何類(lèi))是根類(lèi)object的實(shí)例
print(9,isinstance(Son,(Father,object))) # True
# 說(shuō)明:Son不屬于Father的實(shí)例,但他是根類(lèi)object的實(shí)例
總結(jié)用法:
# 第一種(偽代碼)
isinstance(實(shí)例名, 類(lèi)名)
# 第二種(偽代碼)
isinstance(實(shí)例名, (類(lèi)名1, 類(lèi)名2...)) # 第二個(gè)參數(shù)是類(lèi)名組成的元祖類(lèi)型數(shù)據(jù)。
返回結(jié)果:
布爾值。True或False。
判斷第一個(gè)參數(shù)是第二個(gè)參數(shù)的實(shí)例、或者判斷第一個(gè)參數(shù)屬于第二個(gè)參數(shù)中某個(gè)類(lèi)的實(shí)例,則返回True。反之返回False。
總結(jié)知識(shí)點(diǎn):
1. 子類(lèi)創(chuàng)建的實(shí)例,同屬于該子類(lèi)的父類(lèi)。
2. 父類(lèi)創(chuàng)建的實(shí)例,與他的子類(lèi)沒(méi)關(guān)系。
3. 所有類(lèi),都屬于根類(lèi)object的實(shí)例。
4. 所有實(shí)例,都屬于根類(lèi)object的實(shí)例。
5. 子類(lèi)A創(chuàng)建的實(shí)例,不屬于其他C等子類(lèi)的實(shí)例。
具體值與基本類(lèi)型的歸屬判斷:
看代碼總結(jié)知識(shí)點(diǎn)吧
print(isinstance(1,int)) # True
# 判斷1是否為整數(shù)類(lèi)的實(shí)例,實(shí)例1是整數(shù)類(lèi)的實(shí)例
print(isinstance(1,str)) # False
# 實(shí)例1不是字符串類(lèi)的實(shí)例
print(isinstance(1,(int,str))) # True
# 實(shí)例1是整數(shù)類(lèi)的實(shí)例
print(isinstance(1,object)) # True
# 實(shí)例1是根類(lèi)object的實(shí)例
類(lèi)的繼承升級(jí)版 - 多層繼承
1、啥是多層繼承
繼承不僅可以發(fā)生在兩個(gè)層級(jí)之間(即父類(lèi)-子類(lèi)),還可以有父類(lèi)的父類(lèi)、父類(lèi)的父類(lèi)的父類(lèi)……
比如三個(gè)類(lèi)A、B、C。A是爺爺、B是爸爸、C是兒子。我們可以B繼承A、C再繼承B。后邊再可以有孫子D、D再繼承C等等。。。
這樣一層一層,層層向上/向下繼承,就是多層繼承。
一“碼”以蔽之:
2、偽代碼
class B(A):
...
class C(B):
...
class D(C):
...
class...
3、示例代碼
# 多層繼承
class Grand:
familyName = '郭' # 表示姓氏
class Father(Grand):
fatherName = '明爸'
class Son(Father):
def __init__(self,name):
self.sonName = name
print(self.fatherName) # 子類(lèi)拿到父類(lèi)的屬性
print(self.familyName+self.sonName) # 子類(lèi)拿到父類(lèi)的父類(lèi) 的屬性
son = Son('小明')
# 執(zhí)行后打印
# 明爸
# 郭小明
print(son.fatherName) # 實(shí)例拿到父類(lèi)的屬性
print(son.familyName + son.sonName) # 實(shí)例拿到父類(lèi)的父類(lèi) 的屬性
# 執(zhí)行后打印
# 明爸
# 郭小明
只要你愿意,你可以繼續(xù)拓展上面的例子,或往上(爺爺?shù)陌职郑蛲拢▋鹤拥膬鹤樱K裕鄬永^承又屬于繼承的深度拓展。
4、多層繼承的好處
從上邊代碼就能看出功能,Son類(lèi)創(chuàng)建的實(shí)例不僅可以調(diào)用Father的屬性和方法、還能調(diào)用爺爺Grand類(lèi)的屬性和方法。
結(jié)論就是:子類(lèi)創(chuàng)建的實(shí)例可調(diào)用所有層級(jí)父類(lèi)的屬性和方法。
類(lèi)的繼承升級(jí)版 - 多重繼承
1、啥是多重繼承
一個(gè)類(lèi)同時(shí)繼承多個(gè)類(lèi),就叫多重繼承。就好像同時(shí)擁有好幾個(gè)爸爸。
# 偽代碼:
class A(B,C,D):
2、就近繼承
括號(hào)里B、C和D的順序是有講究的。和子類(lèi)更相關(guān)的父類(lèi)會(huì)放在更左側(cè)。
也就是血緣關(guān)系越深的爸爸,在括號(hào)里的順序越靠前。
既然跟B爸爸最親,所以?xún)鹤覣類(lèi)創(chuàng)建的實(shí)例在調(diào)用屬性和方法時(shí),會(huì)優(yōu)先在最左側(cè)的父類(lèi)B中找,找不到才會(huì)去第二左側(cè)的父類(lèi)C中找,依舊找不到才會(huì)最后去父類(lèi)D中找。有點(diǎn)“就近原則”的意思,當(dāng)然,如果最后幾個(gè)類(lèi)中都沒(méi)找到,
3、爸爸近還是爺爺近
A類(lèi)創(chuàng)建的實(shí)例調(diào)用屬性和方法時(shí),先在直接爸爸A類(lèi)中找,還是先在爸爸繼承的最親近的B類(lèi)中找?(這里A相當(dāng)于A實(shí)例的爸爸,B相當(dāng)于A實(shí)例的爺爺。)
class Grand:
name = '親爺爺'
class Father(Grand):
name = '爸爸'
son = Father()
# 說(shuō)明先在直接爸爸中找屬性
print(son.name) # 爸爸
總結(jié):先在直接爸爸中找屬性。找不到,再去爸爸繼承的爺爺類(lèi)們找。
4、多重繼承的示例
用一段大型家庭倫理來(lái)寫(xiě)一個(gè)多重繼承。
其中,身份情況如下:
| 代表的身份 | 倫理身份 | 對(duì)應(yīng)下邊示例中的變量 |
|---|---|---|
| 實(shí)例 | 兒子 | son |
| A類(lèi) | 爸爸 | Father |
| B類(lèi) | 親爺爺 | 爺爺Grand2在三個(gè)爺爺中排行老二 |
| C類(lèi) | 大爺爺 | Grand1 |
| D類(lèi) | 小爺爺 | Grand3 |
# 多重繼承
class Grand1:
name = '大爺爺'
grand1 = '我是老大'
age = 60
class Grand2:
name = '親爺爺'
grand2 = '我是老二'
age = 59
class Grand3:
name = '小爺爺'
grand3 = '我是老三'
age = 58
hobby = '只有小爺爺有hobby屬性'
class Father(Grand2, Grand1, Grand3):
name = '爸爸'
father = '我是爸爸'
son = Father()
# 說(shuō)明先在直接爸爸中找屬性
print(son.name) # 爸爸
# 以下說(shuō)明實(shí)例可以拿到其他重繼承類(lèi)內(nèi)部的屬性
print(son.father) # 我是爸爸
print(son.grand1) # 我是老大
print(son.grand2) # 我是老二
print(son.grand3) # 我是老三
# 以下說(shuō)明多重繼承的就近原則 - 就近取最近的爺爺?shù)膶傩?br>print(son.age) # 59
# 以下說(shuō)明前幾重父類(lèi)都沒(méi)有,取第一個(gè)有該屬性的父類(lèi),哪怕這個(gè)父類(lèi)時(shí)最后一重繼承的
print(son.hobby) # 只有小爺爺有hobby屬性
5、多重繼承的作用
這自然不用說(shuō),子類(lèi)創(chuàng)建的實(shí)例可調(diào)用所有重父類(lèi)的屬性和方法。
多層繼承和多重繼承
二者的比較
來(lái)一個(gè)比較表格吧
| 名稱(chēng) | 多層繼承 | 多重繼承 |
|---|---|---|
| 寫(xiě)法 | class B(A): ... class C(B): ... |
class A(B, C, D): ... |
| 例子 | 孫子繼承兒子、兒子繼承爸爸、爸爸繼承爺爺 | 爸爸繼承爺爺、大爺爺、小爺爺 |
| 特點(diǎn) | 類(lèi)在縱向上深度拓展 | 類(lèi)在橫向上寬度擴(kuò)展 |
| 作用 | 子類(lèi)創(chuàng)建的實(shí)例,可調(diào)用所有層級(jí)的父類(lèi)的屬性和方法 | 同多層繼承,可以調(diào)用所有。不過(guò)遵循就近原則。優(yōu)先考慮靠近子類(lèi)的父類(lèi)的屬性和方法。 |
二者的結(jié)合
多層繼承和多重繼承二者單用都是一條線,但是將二者結(jié)合起來(lái),那就是個(gè)十字啊!
實(shí)例兒子依次繼承了爸爸、爺爺、大爺爺、小爺爺、爺爺?shù)陌职诌@幾個(gè)類(lèi)的所有屬性和方法。簡(jiǎn)直就是超級(jí)富二代啊~
多層繼承和多重繼承的結(jié)合,讓繼承的類(lèi)擁有更多的屬性和方法,且能更靈活地調(diào)用。進(jìn)而,繼承的力量也得以放大了很多倍。
一碼以蔽之
# 多層繼承和多重繼承結(jié)合
class GrandFather:
name = '爺爺?shù)陌职?太爺爺'
age = 102
class Grand1:
name = '大爺爺'
class Grand2(GrandFather): # 多層繼承1
name = '親爺爺'
class Grand3:
name = '小爺爺(又名二爺爺)'
age = 62
class Father(Grand2, Grand1, Grand3): # 多層繼承2 + 多重繼承
name = '爸爸'
son = Father() # 實(shí)例兒子
print(son.name) # 爸爸
print(son.age) # 102
上例中,son.age這段打印的 102說(shuō)明,雖然Grand2中沒(méi)有,但是Grand2的多層繼承GrandFather中有,所以順序是先從多層中找,最后才考慮多重繼承的Grand3中的變量。
總結(jié):多重繼承中,若某父類(lèi)還有父類(lèi)的話,會(huì)先按照多層繼承的順序,縱向往上找到頂。若到頂還沒(méi)有,則再繼續(xù)向右擴(kuò)展尋找多重的繼承。
類(lèi)的創(chuàng)新
我們可以在繼承父類(lèi)代碼的基礎(chǔ)上,再書(shū)寫(xiě)子類(lèi)自己更具自我特色的代碼。這就是子類(lèi)的創(chuàng)新部分了。
比如下邊代碼中,兒子的姓就是繼承父親的。兒子的名字就是自己創(chuàng)新的部分。兒子籍貫是繼承父類(lèi)后生下來(lái)就有的,但是以后自己跑到北京、杭州居住,那就是自己創(chuàng)新的部分。
創(chuàng)新 - 新增代碼
# 子類(lèi)繼承父類(lèi)并做自我創(chuàng)新
class Father:
familyName = '郭' # 姓氏
nativePlace = '河北省' # 籍貫
def language(self):
print('%s家,母語(yǔ)說(shuō)中國(guó)話' %(self.familyName))
class Son(Father): # 子類(lèi)Son繼承父類(lèi)Father
def __init__(self, name, presentAddress):
self.name = name # 子類(lèi)創(chuàng)新自己的屬性name
self.presentAddress = presentAddress # 子類(lèi)創(chuàng)新自己的屬性presentAddress
def secondLanguage(self, languageName): # 子類(lèi)創(chuàng)新自己的方法secondLanguage
self.language()
print('%s單獨(dú)學(xué)說(shuō)了%s' %(self.name, languageName))
def resume(self): # 子類(lèi)創(chuàng)新自己的方法resume
print('%s姓%s,籍貫是%s。現(xiàn)居住在%s' %(self.name, self.familyName,self.nativePlace, self.presentAddress))
# 子類(lèi)的第一個(gè)實(shí)例
son1 = Son('小菊', '北京')
son1.secondLanguage('英語(yǔ)')
son1.resume()
# 子類(lèi)的第二個(gè)實(shí)例
son2 = Son('小鋒', '杭州')
son2.secondLanguage('韓語(yǔ)')
son2.resume()
# 實(shí)例既可以用子類(lèi)的屬性和方法,也可以調(diào)用父類(lèi)的屬性和方法
print(son1.familyName)
print(son1.nativePlace)
上述代碼中,
子類(lèi)內(nèi)部用的self.language()、以及這個(gè)language方法內(nèi)部用的屬性familyName、子類(lèi)自己方法resume中用的self.nativePlace等都是繼承自父類(lèi)Father的。
這就是繼承的部分。
Son類(lèi)中的self.name、self.presentAddress 是屬于子類(lèi)新增的屬于自己的屬性、
self.secondLanguage、self.resume 是屬于子類(lèi)新增的屬于自己的方法。這就是創(chuàng)新的部分。
好吧,我承認(rèn)這是一句多余的不行的廢話
創(chuàng)新 - 修改(重寫(xiě))繼承的內(nèi)容
在繼承的基礎(chǔ)上可以做新加代碼,甚至可以重寫(xiě)(修改)繼承來(lái)的屬性和方法。
重寫(xiě)代碼: 是在子類(lèi)中,對(duì)父類(lèi)代碼的修改。
還是用代碼來(lái)說(shuō)明問(wèn)題,在上邊代碼的基礎(chǔ)上,我們想一段情景劇:
Father類(lèi)現(xiàn)在有一個(gè)二兒子Son2,他從小生下來(lái)被過(guò)繼給了日本的親叔叔。
因?yàn)槭迨搴桶职滞眨岳^承的屬性“familyName”不用管,還是姓“郭”。但是到了日本后上戶(hù)口就是日本的籍貫了,所以“nativePlace”得修改重寫(xiě)。
另外雖然是爸爸的兒子(繼承自Father),但是因?yàn)樵谌毡鹃L(zhǎng)大,所以母語(yǔ)變成說(shuō)日語(yǔ)了。于是我們重寫(xiě)了繼承來(lái)自爸爸類(lèi)的方法“l(fā)anguage”。如下
class Father:
familyName = '郭'
nativePlace = '河北省'
def language(self):
print('%s家,母語(yǔ)說(shuō)中國(guó)話' %(self.familyName))
class Son(Father): # 子類(lèi)Son繼承父類(lèi)Father
# ...代碼同上一段里的
class Son2(Father): # 繼承父類(lèi)Father,不過(guò)被過(guò)繼給叔叔的二兒子類(lèi)Son2
languageTxt = '日語(yǔ)' # 自己的屬性,屬新增的創(chuàng)新
nativePlace = '北海道' # 修改的屬性,屬重寫(xiě)的創(chuàng)新
def language(self): # 修改的方法,屬重寫(xiě)的創(chuàng)新
print('我的母語(yǔ)說(shuō):', self.languageTxt) # 里邊的代碼有自己定制的內(nèi)容,屬于重寫(xiě)。
son2 = Son2()
son2.language()
# 我的母語(yǔ)說(shuō): 日語(yǔ)
可見(jiàn),重寫(xiě)父類(lèi)的屬性和方法,只要在子類(lèi)中重新定義同名的變量,并做自己的定制代碼即可。
但是,直接在Son2里這么寫(xiě),F(xiàn)ather會(huì)不會(huì)傷心呢?
到底是自己生的兒子,給了別人后就這么迫不及待、直接的修改,爸爸的心,痛啊!
所以,重寫(xiě)代碼按照上邊這么寫(xiě),他粗魯了。那有什么優(yōu)雅的重寫(xiě)嗎?
優(yōu)雅的重寫(xiě)
# 優(yōu)雅的重寫(xiě)
class Father:
familyName = '郭'
nativePlace = '河北省'
def language(self, languageTxt = '中國(guó)話'): # 需要父類(lèi)的這個(gè)方法協(xié)助修改
print('%s家,母語(yǔ)說(shuō)%s' %(self.familyName, languageTxt))
class Son2(Father):
languageTxt = '日語(yǔ)'
nativePlace = '北海道'
def language(self): # 依舊重寫(xiě)方法
Father.language(self, self.languageTxt) # 不過(guò)里邊的代碼不再是粗魯?shù)闹苯有薷臑樽约旱膬?nèi)容,而是調(diào)用父類(lèi)的方法,但是傳不同的參數(shù)。
son2 = Son2()
son2.language()
# 郭家,母語(yǔ)說(shuō)日語(yǔ)
上邊代碼,依舊重寫(xiě)方法。不過(guò)里邊的代碼不再是粗魯?shù)闹苯有薷臑樽约旱膬?nèi)容,而是調(diào)用父類(lèi)的方法,但是傳不同的參數(shù)。
總結(jié):所謂創(chuàng)新,在復(fù)用代碼的基礎(chǔ)上,又能滿足個(gè)性化的需求。
本文使用 mdnice 排版
總結(jié)
以上是生活随笔為你收集整理的【python系统学习14】类的继承与创新的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: js 获取select的值
- 下一篇: 面试系列16 dubbo负载均衡策略和集