1. 程式人生 > >python面向對象(三)之繼承

python面向對象(三)之繼承

init name pytho 需要 down 就是 減少 strong 能力

繼承

介紹

  繼承是從已有的類中派生出新的類,新的類能吸收已有類的數據屬性和行為,並能擴展新的能力。繼承即常說的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面向對象(三)之繼承