在對(duì)于python中類的使用上,我們分出了子類和父類兩種。對(duì)于這二者之間的關(guān)系,我們可以簡單理解為繼承。不過python中加入了實(shí)例的討論,那么對(duì)于繼承后的子類來說,父類的實(shí)例是否被繼承又是我們所需要思考的問題。下面我們就子類和父類進(jìn)行簡單介紹,然后就二者之間的繼承關(guān)系重點(diǎn)分析。
赫章網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)2013年開創(chuàng)至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
1.概念
子類和父類主要描述的是類之間的繼承關(guān)系,即所屬關(guān)系。繼承的類可在被繼承的類的基礎(chǔ)上添加格外的參數(shù)和行為,新類稱為子類,擴(kuò)展類;被繼承的類稱為基類、父類或者超類。
2.繼承關(guān)系
子類與父類的關(guān)系是 “is” 的關(guān)系,如上 Cat 繼承于 Animal 類,我們可以說:
“A”是 Animal 類的實(shí)例,但,“A”不是 Cat 類的實(shí)例。
“C”是 Animal 類的實(shí)例,“C”也是 Cat 類的實(shí)例。
判斷對(duì)象之間的關(guān)系,我們可以通過 isinstance (變量,類型) 來進(jìn)行判斷:
print('"A" IS Animal?', isinstance(A, Animal))
print('"A" IS Cat?', isinstance(A, Cat))
print('"C" IS Animal?', isinstance(C, Animal))
print('"C" IS Cat?', isinstance(C, Cat))
Python實(shí)現(xiàn)子類調(diào)用父類的方法
python和其他面向?qū)ο笳Z言類似,每個(gè)類可以擁有一個(gè)或者多個(gè)父類,它們從父類那里繼承了屬性和方法。如果一個(gè)方法在子類的實(shí)例中被調(diào)用,或者一個(gè)屬性在子類的實(shí)例中被訪問,但是該方法或?qū)傩栽谧宇愔胁⒉淮嬖冢敲淳蜁?huì)自動(dòng)的去其父類中進(jìn)行查找。
繼承父類后,就能調(diào)用父類方法和訪問父類屬性,而要完成整個(gè)集成過程,子類是需要調(diào)用的構(gòu)造函數(shù)的。
子類不顯式調(diào)用父類的構(gòu)造方法,而父類構(gòu)造函數(shù)初始化了一些屬性,就會(huì)出現(xiàn)問題
如果子類和父類都有構(gòu)造函數(shù),子類其實(shí)是重寫了父類的構(gòu)造函數(shù),如果不顯式調(diào)用父類構(gòu)造函數(shù),父類的構(gòu)造函數(shù)就不會(huì)被執(zhí)行,導(dǎo)致子類實(shí)例訪問父類初始化方法中初始的變量就會(huì)出現(xiàn)問題。
你好,請(qǐng)看下面的例子和說明:
python中類的初始化方法是__init__(),因此父類子類的初始化方法都是這個(gè),如果子類不實(shí)現(xiàn)這個(gè)函數(shù),初始化時(shí)調(diào)用父類的初始化函數(shù),如果子類實(shí)現(xiàn)這個(gè)函數(shù),就覆蓋了父類的這個(gè)函數(shù),既然繼承父類,就要在這個(gè)函數(shù)里顯式調(diào)用一下父類的__init__(),這跟C++,jAVA不一樣,他們是自動(dòng)調(diào)用父類初始化函數(shù)的。
調(diào)用父類函數(shù)有以下方法:class A:def method(self, arg):pass
class?B(A):
def?method(self,?arg):
#????????A.method(self,arg)????????????????#?1
#????????super(B,?self).method(arg)????#2
super().method(arg)????????????????#3
1.直接寫類名調(diào)用
2.用super(type,obj).method(arg)方法調(diào)用。
3.在類定義中調(diào)用本類的父類方法,可以直接
super().method(arg).
在代碼中調(diào)用對(duì)象的父類的方法的示例:ob = B()super(B,ob).method(arg) ? ?#調(diào)用class B的父類class A的method。
初始化中調(diào)用父類初始化方法示例:
class B(A):
兩種方法解決:
- 第一種
class A:
def __init__(self):
self.namea="aaa"
def funca(self):
print "function a : %s"%self.namea
class B(A):
def __init__(self):
#這一行解決了問題
A.__init__(self)
self.nameb="bbb"
def funcb(self):
print "function b : %s"%self.nameb
b=B()
print b.nameb
b.funcb()
b.funca()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
第二種:
#父類需要繼承object對(duì)象
class A(object):
def __init__(self):
self.namea="aaa"
def funca(self):
print "function a : %s"%self.namea
class B(A):
def __init__(self):
#這一行解決問題
super(B,self).__init__()
self.nameb="bbb"
def funcb(self):
print "function b : %s"%self.nameb
b=B()
print b.nameb
b.funcb()
b.funca()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PS:讓類A繼承自object類,這樣才能使用super函數(shù),因?yàn)檫@是python的“新式類”支持的特性。當(dāng)前的class和對(duì)象可以作為super函數(shù)的參數(shù)使用,調(diào)用函數(shù)返回的對(duì)象的任何方法都是調(diào)用超類的方法,而不是當(dāng)前類的方法。
優(yōu)劣:
- 方法一更直觀,方法二可以一次初始化所有超類
- super函數(shù)比在超類中直接調(diào)用未綁定方法更直觀,但是其最大的優(yōu)點(diǎn)是如果子類繼承了多個(gè)父類,它只需要使用一次super函數(shù)就可以。然而如果沒有這個(gè)需求,直接使用A.init(self)更直觀一些。