python 類(lèi)的繼承
對(duì)于許多文章講解python類(lèi)的繼承,大多數(shù)都是說(shuō)一些什么oop,多態(tài)等概念,我認(rèn)為這樣可能對(duì)有一定基礎(chǔ)的開(kāi)發(fā)者幫助不是那么大,不如直接用在各種情況下所寫(xiě)的代碼,來(lái)展示對(duì)于某一種代碼情況,代碼運(yùn)行會(huì)有什么效果。這樣可能對(duì)開(kāi)發(fā)者的幫助更大。不說(shuō)廢話(huà),直接上代碼。
這里不區(qū)分經(jīng)典類(lèi)和新式類(lèi),下面分析的對(duì)新式類(lèi)和經(jīng)典類(lèi)都適用
對(duì)于類(lèi)中的__init__函數(shù),只是一個(gè)初始化是調(diào)用的一個(gè)函數(shù)(ps:初始化和創(chuàng)建實(shí)例并不是一個(gè)過(guò)程,實(shí)例的創(chuàng)建是通過(guò)一個(gè)create函數(shù)來(lái)完成的),如果在子類(lèi)中沒(méi)有顯示的聲明__init__函數(shù),則子類(lèi)就會(huì)調(diào)用父類(lèi)的__init__函數(shù),但是不會(huì)再調(diào)用父類(lèi)的父類(lèi)中的__init__函數(shù),如果顯示的聲明了__init__ 函數(shù),則在子類(lèi)的初始化的時(shí)候就不會(huì)調(diào)用父類(lèi)的初始化函數(shù),只會(huì)調(diào)用子類(lèi)中聲明的__init__函數(shù), 同時(shí)在子類(lèi)實(shí)例中也不會(huì)有父類(lèi)__init__函數(shù)中聲明的屬性,
例子:
class animal():
name="hh"
sex="man"
def __init__(self):
self.height=10
self.weight=50
def deception(self):
print "ansible.height:"+self.height+" animal.weight:"+self.weight
def run(self):
print "animal is running...."
class dog(animal):
def __init__(self):
pass
if __name__=="__main__":
dg=dog()
print dg.__dict__
此時(shí)運(yùn)行的結(jié)果為
{}
當(dāng)把dog類(lèi)修改為如下時(shí)(ps:此時(shí)沒(méi)有顯示的聲明__init__方法):
class dog(animal):
def run(self):
print "dog is running..."
此時(shí)由于直接調(diào)用的父類(lèi)animal的__init__方法,結(jié)果如下:
{'weight': 50, 'height': 10}
如果此時(shí)有一個(gè)類(lèi)繼承dog類(lèi),此時(shí)會(huì)出現(xiàn)什么情況呢?(python解釋器先在子類(lèi)中尋找__init__方法,如果沒(méi)有找到,再?gòu)母割?lèi)中找,直到找到為止,并運(yùn)行,并且不再運(yùn)行父類(lèi)的父類(lèi)的__init__方法,此時(shí)沒(méi)有運(yùn)行的__init__方法中的創(chuàng)建的屬性是沒(méi)有的,例如上面的例子,第一次運(yùn)行時(shí)得到的例子中并沒(méi)有weight和height屬性)
class animal():
name="hh"
sex=""
def __init__(self):
self.height=10
self.weight=50
def deception(self):
print "ansible.height:"+self.height+" animal.weight:"+self.weight
def run(self):
print "animal is running...."
class dog(animal):
def __init__(self):
pass
def run(self):
print "dog is running..."
class jinmao(dog):
# def __init__(self):
# self.ji="jinmao"
pass
if __name__=="__main__":
dg=jinmao()
print dg.__dict__
此時(shí)的結(jié)果一樣是
{}
在類(lèi)的多繼承中會(huì)產(chǎn)生什么狀況呢?(在多繼承中會(huì)運(yùn)行類(lèi)的繼承參數(shù)中的第一個(gè)參數(shù)聲明的父類(lèi)中的__init__函數(shù),如果父類(lèi)中沒(méi)有__init__函數(shù),繼續(xù)尋找父類(lèi)的父類(lèi)中有沒(méi)有,以此類(lèi)推。。。如果找到了頭還是沒(méi)有,則換為第二個(gè)參數(shù)聲明的父類(lèi),過(guò)程如第一個(gè)參數(shù),知道找到__init__函數(shù)為止,如果都沒(méi)有找到,則不初始化),代碼可以根據(jù)前面例子自己測(cè)試。
對(duì)于在子類(lèi)中調(diào)用父類(lèi)中的方法的super的使用與特性。
總結(jié): 如果想了解python虛擬機(jī)具體是怎么創(chuàng)建類(lèi)的(具體到當(dāng)加載一個(gè).pyc文件時(shí),是怎么通過(guò)c語(yǔ)言的代碼邏輯來(lái)把類(lèi)對(duì)象放到一塊內(nèi)存中的,我也在了解這方面的內(nèi)容,希望咱們一塊探索)
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

