python繼承:即一個派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個派生類的對象作為一個基類對象對待。
成都服務(wù)器托管,創(chuàng)新互聯(lián)提供包括服務(wù)器租用、電信內(nèi)江機房、帶寬租用、云主機、機柜租用、主機租用托管、CDN網(wǎng)站加速、域名注冊等業(yè)務(wù)的一體化完整服務(wù)。電話咨詢:18982081108
9.5. 繼承
當然,如果一種語言不支持繼承就,“類”就沒有什么意義。派生類的定義如下所示:
class DerivedClassName(BaseClassName):
命名 BaseClassName (示例中的基類名)必須與派生類定義在一個作用域內(nèi)。除了類,還可以用表達式,基類定義在另一個模塊中時這一點非常有用:
class DerivedClassName(modname.BaseClassName):
派生類定義的執(zhí)行過程和基類是一樣的。構(gòu)造派生類對象時,就記住了基類。這在解析屬性引用的時候尤其有用:如果在類中找不到請求調(diào)用的屬性,就搜索基類。如果基類是由別的類派生而來,這個規(guī)則會遞歸的應(yīng)用上去。
派生類的實例化沒有什么特殊之處: DerivedClassName() (示列中的派生類)創(chuàng)建一個新的類實例。方法引用按如下規(guī)則解析:搜索對應(yīng)的類屬性,必要時沿基類鏈逐級搜索,如果找到了函數(shù)對象這個方法引用就是合法的。
派生類可能會覆蓋其基類的方法。因為方法調(diào)用同一個對象中的其它方法時沒有特權(quán),基類的方法調(diào)用同一個基類的方法時,可能實際上最終調(diào)用了派生類中的覆蓋方法。(對于 C++ 程序員來說,Python 中的所有方法本質(zhì)上都是 虛 方法。)
派生類中的覆蓋方法可能是想要擴充而不是簡單的替代基類中的重名方法。有一個簡單的方法可以直接調(diào)用基類方法,只要調(diào)用: BaseClassName.methodname(self, arguments)。有時這對于客戶也很有用。(要注意只有 BaseClassName 在同一全局作用域定義或?qū)霑r才能這樣用。)
Python 有兩個用于繼承的函數(shù):
函數(shù) isinstance() 用于檢查實例類型: isinstance(obj, int) 只有在 obj.__class__ 是 int 或其它從 int 繼承的類型
函數(shù) issubclass() 用于檢查類繼承: issubclass(bool, int) 為 True,因為 bool 是 int 的子類。
然而, issubclass(float, int) 為 False,因為 float 不是 int 的子類。
類(Class): 用來描述具有相同的屬性和方法的對象的集合。
類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數(shù)體之外。類變量通常不作為實例變量使用。
類有一個名為 __init__() 的特殊方法(構(gòu)造方法),該方法在類實例化時會自動調(diào)用
self:self 代表的是類的實例,代表當前對象的地址,而 self.class 則指向類。
類調(diào)用 Car.weight
實例化 car01=Car(5)
實例對象調(diào)用 car01.weght
我們在構(gòu)造類時,Python3默認我們繼承了object這個基類,我個人理解object就是個空的類,可以不用管為何要在括號中寫上object,這是Python3的特性,在python2中如果你沒有寫object的話不會默認繼承了object這個基類。
同樣的我們自己希望繼承的父類只需要把objetc改為我們自己定義的類名即可。子類中可以擁有父類中所有的公有屬性和方法,但是可以通過在變量名前加下劃線使其變?yōu)樗接校@樣子類就不可以訪問父類中的成員了。
以下三個公交車類的父類均為客車類,我們可以寫一個funcs方法使得每次調(diào)用funcs方法時,傳入不同的對象以執(zhí)行不同的func方法,具體實現(xiàn)如下:
主函數(shù) :
可以看到,我將小 汽車 實例化為帶有重量為5t的一個具體對象,將客車實例化為帶有重量為20t的一個具體對象,將三個公交車實例化為帶有重量為15t的一個具體對象.
如上圖所示,我每次在調(diào)用funcs方法時都傳入了一個實例化對象,funcs根據(jù)不同的對象執(zhí)行相應(yīng)的內(nèi)部方法。