繼承的意義
? ? ? ? ?繼承是面向?qū)ο蠹夹g(shù)的重要內(nèi)容磺平,有了繼承魂仍,使軟件的重用成為可能。
? ? ? ? ?過去褪秀,軟件人員開發(fā)新的軟件蓄诽,能從已有的軟件中直接選用完全符合要求的部件不多,一般都要進(jìn)行許多修改才能使用媒吗,實(shí)際上有相當(dāng)部分要重新編寫仑氛,工作量很大≌⒂ⅲ縮短軟件開發(fā)過程的關(guān)鍵是鼓勵(lì)軟件重用锯岖。繼承機(jī)制解決了這個(gè)問題。編寫面向?qū)ο蟮某绦驎r(shí)要把注意力放在實(shí)現(xiàn)對(duì)自己有用的類上面甫何,對(duì)已有的類加以整理和分類出吹,進(jìn)行剪裁和修改,在此基礎(chǔ)上集中精力編寫派生類新增加的部分辙喂,使這些類能夠被程序設(shè)計(jì)的許多領(lǐng)域使用捶牢。
? ? ? ? ?由于繼承的機(jī)制,這就吸引了許多人開發(fā)各類實(shí)用的類庫巍耗。用戶將它們作為基類去建立適合于自己的類(即派生類)秋麸,并在此基礎(chǔ)上設(shè)計(jì)自己的應(yīng)用程序。類庫的出現(xiàn)使得軟件的重用更加方便
? ? ? ? ? 人們?yōu)槭裁催@么看重繼承炬太,要求在軟件開發(fā)中使用繼承機(jī)制灸蟆,盡可能地通過繼承建立一批新的類?為什么不是將已有的類加以修改亲族,使之滿足自己應(yīng)用的要求呢炒考?
歸納起來可缚,有以下幾個(gè)原因:
? ? ? ? 有許多基類是被程序的其他部分或其他程序使用的,這些程序要求保留原有的 基類不受破壞斋枢。使用繼承是建立新的數(shù)據(jù)類型帘靡,它繼承了基類的所有特征,但不改變基類本身杏慰〔饽基類的名稱、構(gòu)成和訪問屬性絲毫沒有改變缘滥,不會(huì)影響其他程序的使用轰胁。。
? ? ? ? ?許多基類是專門作為基類設(shè)計(jì)的朝扼。有些基類可能并沒有什么獨(dú)立的功能赃阀,只是一個(gè)框架,或者說是抽象類擎颖。人們根據(jù)需要設(shè)計(jì)了一批能適用于不同用途的通用類榛斯,目的是建立通用的數(shù)據(jù)結(jié)構(gòu),以便在此基礎(chǔ)上添加各種功能搂捧,從而建立各種功能的派生類驮俗。
? ? ? ? ? 在面向?qū)ο蟪绦蛟O(shè)計(jì)中,需要設(shè)計(jì)類的層次結(jié)構(gòu)允跑,從最初的抽象類出發(fā)王凑,每一層派生類的建立都逐步地向著目標(biāo)的具體實(shí)現(xiàn)前進(jìn),換句話說聋丝,是不斷地從抽象到具體的過程索烹。每一層的派生和繼承都需要站在整個(gè)系統(tǒng)的角度統(tǒng)一規(guī)劃,精心組織弱睦。
Python中繼承的過程
繼承的語法:
class類型(被繼承的類型):
? ? ? ? ? ?pass
繼承中出現(xiàn)的術(shù)語:
父類:被繼承的類百姓,也稱為基類、超類
子類:當(dāng)前類况木,也稱為派生類
子類繼承父類垒拢,體現(xiàn)的時(shí)A is a B的關(guān)系
子類繼承父類,就可以使用父類中所有的公開的屬性和方法
繼承鏈:
A繼承B火惊,B繼承C子库,C繼承D
A直接繼承了B,間接繼承了C,D矗晃;此時(shí)A創(chuàng)建的對(duì)象,可以同時(shí)使用B,C,D中所有公開的屬性和方法
多繼承:
python中宴倍,一個(gè)類型张症,可以同時(shí)繼承多個(gè)類型仓技,同時(shí)擁有所有繼承類型的所有公開的屬性和方法
備注:在進(jìn)行代碼設(shè)計(jì)的過程中,可能會(huì)出現(xiàn)多繼承俗他,所以盡量不要在父類中定義相同名稱的屬性或者方法
備注2:如果父類中出現(xiàn)了相同名稱的屬性和方法脖捻,在使用的時(shí)候子類調(diào)用時(shí)會(huì)優(yōu)先繼承優(yōu)先調(diào)用。
方法重寫:
子類在自己類中重新定義父類中已經(jīng)存在的方法兆衅,在執(zhí)行該方法時(shí)地沮,如果子類中沒有重寫就直接調(diào)用父類的方法,如果子類重寫了該方法羡亩,就直接調(diào)用子類重寫的方法摩疑!
擴(kuò)展:子類中,訪問父類的屬性和方法:
classUser(Person):
? ? ? ? ? ? ?def__init__(self, name, age):
? ? ? ? ?? ? ? ? ? ? ? ?#直接通過父類的類名稱調(diào)用父類的屬性和方法
? ? ? ? ? ? ? ? ? ? ? ? Person.__init__(name, age)
? ? ? ? ? ? ? ? ? ? ? ? #通過super()來調(diào)用父類的屬性和方法
? ? ? ? ? ? ? ? ? ? ? ? super().__init__(name, age)