Python進(jìn)階語(yǔ)法之類(lèi)的繼承
在編寫(xiě)類(lèi)時(shí),我們并非每次都需要從空白開(kāi)始。
如果我們要編寫(xiě)的類(lèi)是我們?cè)?jīng)編寫(xiě)過(guò)的類(lèi)(現(xiàn)成的)的特殊版本,可使用繼承。
一個(gè)類(lèi)繼承另一個(gè)類(lèi)時(shí),將自動(dòng)獲得另一個(gè)類(lèi)的所有屬性和方法。原有的類(lèi)稱(chēng)為父類(lèi),而新類(lèi)稱(chēng)為子類(lèi)。子類(lèi)繼承了父類(lèi)的所有屬性和方法,同時(shí)還可以定義自己的屬性和方法。
一、子類(lèi)的方法__init__( )
在既有類(lèi)的基礎(chǔ)上編寫(xiě)新類(lèi)時(shí),通常要調(diào)用父類(lèi)的方法__init__( )。這將初始化在父類(lèi)__init__( )方法中定義的所有屬性,從而讓子類(lèi)包含這些屬性。
例如,下面來(lái)模擬電動(dòng)汽車(chē)。電動(dòng)汽車(chē)是一種特殊的汽車(chē),因此可在前面創(chuàng)建的Car類(lèi)的基礎(chǔ)上創(chuàng)建新類(lèi)ElelctricCar。這樣就只需為電動(dòng)汽車(chē)特有的屬性和行為編寫(xiě)代碼。
創(chuàng)建一個(gè)Car類(lèi)
class Car: """一次模擬汽車(chē)的簡(jiǎn)單嘗試""" def __init__(self, make, model, year): """初始化汽車(chē)的屬性""" self.make = make self.model = model self.year = year self.odometer_reading = 0 def get_descriptive_name(self): """返回整潔的描述性信息""" long_name = f'{self.year}{self.make}{self.model}' return long_name.title() def read_odometer(self): """打印一條指出汽車(chē)?yán)锍痰南?"" print(f"This car has {self.odometer_reading} miles on it") def update_odometer(self, mileage): if mileage >= self.odometer_reading: self.odometer_reading = mileage else: print('你怎么能調(diào)表呢??。。?!') def increment_odoment(self,miles): """將里程表讀數(shù)增加到指定數(shù)量""" self.odometer_reading+=miles
創(chuàng)建子類(lèi)ElelctricCar
下面我們來(lái)創(chuàng)建ElelctricCar類(lèi)的一個(gè)簡(jiǎn)單版本,它具備Car類(lèi)的所有功能:
class Car pass class ElectricCar(Car): """電動(dòng)汽車(chē)的獨(dú)特之處""" def __init__(self,make,model,year): """初始化父類(lèi)的屬性""" super().__init__(make, model, year) my_tesla=ElectricCar(' tesla', ' models', 2021) print(my_tesla.get_descriptive_name())
首先是Car類(lèi)的代碼。創(chuàng)建子類(lèi)時(shí),父類(lèi)必須包含在當(dāng)前文件中,且位于子類(lèi)的前面。定義子類(lèi)ElectricCar。定義子類(lèi)時(shí),必須在圓括號(hào)內(nèi)指定父類(lèi)的名稱(chēng)。方法__init__( )接受創(chuàng)建Car實(shí)例所有需要的信息。
super()是一個(gè)特殊函數(shù),讓你能夠調(diào)用父類(lèi)的方法。這行代碼能讓Pyhton調(diào)用Car類(lèi)的方法__init__( ),讓ElectricCar實(shí)例包含這個(gè)方法中定義的所有屬性。父類(lèi)也稱(chēng)為超類(lèi)(superclass),名稱(chēng)super由此而來(lái)。
二、給子類(lèi)定義屬性和方法
讓一個(gè)類(lèi)繼承另一個(gè)類(lèi)后,就可以添加區(qū)分子類(lèi)和父類(lèi)所需的新屬性和新方法了。
下面來(lái)添加一個(gè)電動(dòng)汽車(chē)特有的屬性(電瓶),以及一個(gè)描述該屬性的方法。我們將存儲(chǔ)電瓶容量,并編寫(xiě)一個(gè)打印電瓶描述的方法:
class Car: pass def __init__(self,make,model,year): """初始化父類(lèi)的屬性。 再初始化電動(dòng)汽車(chē)特有的屬性""" super().__init__(make, model, year) self.battery_size = 75 def descibe_battery(self): """打印一條描述電瓶容量的消息""" print(f"這個(gè)車(chē)有{self.battery_size}千瓦時(shí)的電池") my_tesla=ElectricCar(' tesla', ' models', 2021) print(my_tesla.get_descriptive_name()) my_tesla.descibe_battery()
在這里給Car類(lèi)添加的子類(lèi)ElectricCar類(lèi)中,又定義了一個(gè)battery_size屬性,,并且添加了一個(gè)describer_battery( )方法 ,打印有關(guān)電瓶的信息。調(diào)用這個(gè)方法時(shí),將會(huì)看到一特有的描述:
2021 Tesla Models
這個(gè)車(chē)有75千瓦時(shí)的電池
三、重寫(xiě)父類(lèi)的方法
對(duì)于父類(lèi)的方法,我們有可能發(fā)現(xiàn)父類(lèi)的方法不符合子類(lèi)模擬的實(shí)物的行為,這時(shí)我們便可以改寫(xiě)它。為此,我們可以在子類(lèi)中定義一個(gè)與要重寫(xiě)的父類(lèi)方法同名的方法。這樣Python將不會(huì)考慮這個(gè)父類(lèi)的方法。
比如:
class ElectricCar(Car): pass def fill_gas_tank(self): """電動(dòng)汽車(chē)沒(méi)有油箱""" print("這個(gè)車(chē)沒(méi)有油箱!")
將此定義在子類(lèi)也寫(xiě)一遍之后,即可覆蓋父類(lèi)中的方法。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
opencv python簡(jiǎn)易文檔之圖像處理算法
OpenCV是一個(gè)開(kāi)源庫(kù),包含了許多計(jì)算機(jī)視覺(jué)算法,它在計(jì)算機(jī)視覺(jué)和圖像處理中起著重要作用,用于實(shí)時(shí)操作,其效率足以滿(mǎn)足工業(yè)上的要求,這篇文章主要給大家介紹了關(guān)于opencv python簡(jiǎn)易文檔之圖像處理算法的相關(guān)資料,需要的朋友可以參考下2021-08-08Python針對(duì)給定列表中元素進(jìn)行翻轉(zhuǎn)操作的方法分析
這篇文章主要介紹了Python針對(duì)給定列表中元素進(jìn)行翻轉(zhuǎn)操作的方法,結(jié)合實(shí)例形式分析了Python針對(duì)列表元素基于切片及遍歷輸出兩種翻轉(zhuǎn)操作實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2018-04-04基于深度學(xué)習(xí)和OpenCV實(shí)現(xiàn)目標(biāo)檢測(cè)
這篇文章主要介紹了通過(guò)使用OpenCV進(jìn)行基于深度學(xué)習(xí)的對(duì)象檢測(cè)以及使用OpenCV檢測(cè)視頻,文中的示例代碼講解詳細(xì),需要的可以參考一下2021-12-12python實(shí)現(xiàn)bucket排序算法實(shí)例分析
這篇文章主要介紹了python實(shí)現(xiàn)bucket排序算法,實(shí)例分析了Python排序的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05Python實(shí)現(xiàn)生活常識(shí)解答機(jī)器人
今天教大家如何用Python爬蟲(chóng)去搭建一個(gè)「生活常識(shí)解答」機(jī)器人.思路:這個(gè)機(jī)器人主要是依托于“阿里達(dá)摩院發(fā)布的語(yǔ)言模型PLUG”,通過(guò)爬蟲(chóng)的方式,發(fā)送post請(qǐng)求(提問(wèn)),然后返回json數(shù)據(jù)(回答),需要的朋友可以參考下2021-06-06Python curses內(nèi)置顏色用法實(shí)例
在本篇文章里小編給大家整理的是一篇關(guān)于Python curses內(nèi)置顏色用法實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-06-06使用Python 操作 xmind 繪制思維導(dǎo)圖的詳細(xì)方法
在平時(shí)的工作中當(dāng)我們要總結(jié)一些知識(shí)的時(shí)候就需要一款工具來(lái)畫(huà)畫(huà)流程圖,這里推薦 XMind 軟件,用 Xmind 繪制的思維導(dǎo)圖看起來(lái)思路清晰,那么今天的文章介紹關(guān)于思維導(dǎo)圖的相關(guān)知識(shí)以及用 Python 如何操作 Xmind 繪制思維導(dǎo)圖2021-10-10