python面向對象(三)之繼承
繼承
介紹
繼承是從已有的類中派生出新的類,新的類能吸收已有類的數據屬性和行為,並能擴展新的能力。繼承即常說的is-a關系。子類繼承父類的特征和行為,使得子類具有父類的各種屬性和方法。或子類從父類繼承方法,使得子類具有父類相同的行為。
例子:
比如可以先定義一個類叫車,車有以下屬性:車體大小,顏色,方向盤,輪胎,而又由車這個類派生出轎車和卡車兩個類,為轎車添加一個小後備箱,而為卡車添加一個大貨箱。
繼承所表達的就是一種對象類之間的相交關系,它使得某類對象可以繼承另外一類對象的數據成員和成員方法。若類B繼承類A,則屬於B的對象便具有類A的全部或部分性質(數據屬性)和功能(操作),我們稱被繼承的類A為基類、父類或超類,而稱繼承類B為A的派生類或子類。
表示父類和子類的術語:父類和子類、超類和子類、基類和派生類,他們表示的是同一個意思。
為什麽需要繼承
開發動物類,其中動物分別為企鵝以及老鼠,要求如下:
企鵝:屬性(姓名,id),方法(吃,睡,自我介紹)
老鼠:屬性(姓名,id),方法(吃,睡,自我介紹)
企鵝和老鼠都是動物我們是不是可以寫一個動物類,這樣代碼是不是簡潔了許多。有的人說我就想單獨建兩個類寫這個屬性,我只能告訴你可以,但這好比,你父親給你了幾百萬,你偏不要,把這些錢扔了非要自己去掙,你想這樣我也沒辦法。既然java給我們提供了繼承我們就要好好用這樣會大大提高我們的開發效率,比如:維護性提高了,代碼也更加簡潔,提高代碼的復用性也提高了(復用性指可以多次使用,不用再多次寫同樣的代碼)。
作用:
1、繼承可以減少重復的代碼。比如父類已經提供的方法,子類可以直接使用,不必再去實現。
2、繼承是多態性的前提。當然使用繼承的同時也提高了類的耦合度。
當你不需要父類的屬性時,可以覆蓋調原屬性。
python繼承
繼承分為多繼承和單繼承,而python就屬於多繼承。python也和java有些區別,在這裏也說一下
特點:
? 1:繼承語法 class 派生類名(基類名)://... 基類名寫作括號裏,基本類是在類定義的時候,在元組之中指明的,新式類的基類默認是有object的,同時基類右多個的話就為多繼承
? 2:在繼承中基類的構造(init()方法)不會被自動調用,它需要在其派生類的構造中親自專門調用。有別於java,java是自動調用初始化方法的。
3:在調用基類的方法時,需要加上基類的類名前綴,且需要帶上self參數變量。區別於在類中調用普通函數時並不需要帶上self參數
4:Python總是首先查找對應類型的方法,如果它不能在派生類中找到對應的方法,它才開始到基類中逐個查找。(先在本類中查找調用的方法,找不到才去基類中找)。
初始化
第一種方法:基類名.__init__(self,arg)
class A(object): # 新式類
"""基類"""
def __init__(self, name, age):
# super(A, self).__init__()
self.name = name
self.age = age
class B(object):
"""基類"""
def __init__(self, height):
self.height=height
class C(A):
"""繼承一個,單繼承"""
def __init__(self, name, age, sex):
A.__init__(self, name, age) #第一種方法
self.sex = sex
class D(A,B):
"""繼承一個,單繼承"""
def __init__(self, name, age, sex,height):
A.__init__(self, name, age) #第一種方法
B.__init__(self, height)
self.sex = sex
第二種方法:supper關鍵字 即 supper(obj,self).__init__(arg)
class A(object): # 新式類
"""基類"""
def __init__(self, name, age):
super(A, self).__init__()
self.name = name
self.age = age
class B(object):
"""基類"""
def __init__(self, height):
self.height=height
class C(A):
"""繼承一個,單繼承"""
def __init__(self, name, age, sex):
super(C, self).__init__(name, age) #第二種方法
self.sex = sex
class D(A,B):
"""繼承一個,單繼承"""
def __init__(self, name, age, sex,height):
super(D, self).__init__(name, age) #第二種方法
# 使用此方法只能初始化第一個基類,第二個基類如果有不一樣的參數就無法初始化,建議使用第一種
self.sex = sex
註:單繼承時推薦第二種,多繼承時使用第一種
多重繼承的目的是從兩種繼承樹中分別選擇並繼承出子類,以便組合功能使用。java的多繼承是通過實現多個接口實現的。
isinstance(a,b)
可以判斷判斷一個變量的類型,可以用來判斷a是否為b的實例對象,返回True或False
type()
函數獲取變量的類型,返回變量的類型
python面向對象(三)之繼承