python3 類的繼承

1.繼承的定義

  繼承是一種建立新類的方式,在python中,新建的類能夠繼承一個或多個父類,父類又可稱爲基類或超類,新建的類稱爲派生類或子類。python

2.單繼承和多繼承

class ParentClass1: #定義父類
    pass

class ParentClass2: #定義父類
    pass

class SubClass1(ParentClass1): #單繼承,基類是ParentClass1,派生類是SubClass
    pass

class SubClass2(ParentClass1,ParentClass2): #python支持多繼承,用逗號分隔開多個繼承的類
    pass

查看繼承編程

>>> SubClass1.__bases__ #__base__只查看從左到右繼承的第一個子類,__bases__則是查看全部繼承的父類
(<class '__main__.ParentClass1'>,) >>> SubClass2.__bases__ (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)

  提示:若是沒有指定基類,python的類會默認繼承object類,object是全部python類的基類,它提供了一些常見方法(如__str__)的實現。編程語言

>>> ParentClass1.__bases__ (<class 'object'>,) >>> ParentClass2.__bases__ (<class 'object'>,)

3.繼承與抽象(先抽象再繼承)

  抽象即抽取相似或者說比較像的部分。ide

  抽象分紅兩個層次: 函數

    1.將奧巴馬和梅西這倆對象比較像的部分抽取成類; spa

    2.將人,豬,狗這三個類比較像的部分抽取成父類。設計

  抽象最主要的做用是劃分類別(能夠隔離關注點,下降複雜度)code

 

繼承:是基於抽象的結果,經過編程語言去實現它,確定是先經歷抽象這個過程,才能經過繼承的方式去表達出抽象的結構。對象

抽象只是分析和設計的過程當中,一個動做或者說一種技巧,經過抽象能夠獲得類blog

4.繼承與重用性

複製代碼 ==========================第一部分 例如   貓能夠:喵喵叫、吃、喝、拉、撒   狗能夠:汪汪叫、吃、喝、拉、撒 若是咱們要分別爲貓和狗建立一個類,那麼就須要爲 貓 和 狗 實現他們全部的功能,僞代碼以下: #貓和狗有大量相同的內容
class 貓: def 喵喵叫(self): print '喵喵叫'

    def 吃(self): # do something

    def 喝(self): # do something

    def 拉(self): # do something

    def 撒(self): # do something

class 狗: def 汪汪叫(self): print '汪汪叫'

    def 吃(self): # do something

    def 喝(self): # do something

    def 拉(self): # do something

    def 撒(self): # do something



==========================第二部分 上述代碼不難看出,吃、喝、拉、撒是貓和狗都具備的功能,而咱們卻分別的貓和狗的類中編寫了兩次。若是使用 繼承 的思想,以下實現:   動物:吃、喝、拉、撒    貓:喵喵叫(貓繼承動物的功能)    狗:汪汪叫(狗繼承動物的功能) 僞代碼以下: class 動物: def 吃(self): # do something

    def 喝(self): # do something

    def 拉(self): # do something

    def 撒(self): # do something

# 在類後面括號中寫入另一個類名,表示當前類繼承另一個類
class 貓(動物): def 喵喵叫(self): print '喵喵叫'
        
# 在類後面括號中寫入另一個類名,表示當前類繼承另一個類
class 狗(動物): def 汪汪叫(self): print '汪汪叫'




==========================第三部分 #繼承的代碼實現
class Animal: def eat(self): print("%s 吃 " %self.name) def drink(self): print ("%s 喝 " %self.name) def shit(self): print ("%s 拉 " %self.name) def pee(self): print ("%s 撒 " %self.name) class Cat(Animal): def __init__(self, name): self.name = name self.breed = ''

    def cry(self): print('喵喵叫') class Dog(Animal): def __init__(self, name): self.name = name self.breed=''

    def cry(self): print('汪汪叫') # ######### 執行 #########
 c1 = Cat('小白家的小黑貓') c1.eat() c2 = Cat('小黑的小白貓') c2.drink() d1 = Dog('胖子家的小瘦狗') d1.eat() 使用繼承來重用代碼比較好的例子
繼承與重用性

  在開發程序的過程當中,若是咱們定義了一個類A,而後又想新創建另一個類B,可是類B的大部份內容與類A的相同時

  咱們不可能從頭開始寫一個類B,這就用到了類的繼承的概念。

  經過繼承的方式新建類B,讓B繼承A,B會‘遺傳’A的全部屬性(數據屬性和函數屬性),實現代碼重用

class Animal: ''' 人和狗都是動物,因此創造一個Animal基類 '''
    def __init__(self, name, aggressivity, life_value): self.name = name  # 人和狗都有本身的暱稱;
        self.aggressivity = aggressivity  # 人和狗都有本身的攻擊力;
        self.life_value = life_value  # 人和狗都有本身的生命值;

    def eat(self): print('%s is eating'%self.name) class Dog(Animal): pass

class Person(Animal): pass egg = Person('egon',10,1000) ha2 = Dog('二愣子',50,1000) egg.eat() ha2.eat()

  提示:用已經有的類創建一個新的類,這樣就重用了已經有的軟件中的一部分設置大部分,大大生了編程工做量,這就是常說的軟件重用,不只能夠重用本身的類,也能夠繼承別人的,好比標準庫,來定製新的數據類型,這樣就是大大縮短了軟件開發週期,對大型軟件開發來講,意義重大。

 5.類的派生

  固然子類也能夠添加本身新的屬性或者在本身這裏從新定義這些屬性(不會影響到父類),須要注意的是,一旦從新定義了本身的屬性且與父類重名,那麼調用新增的屬性時,就以本身爲準了。

class Animal: ''' 人和狗都是動物,因此創造一個Animal基類 '''
    def __init__(self, name, aggressivity, life_value): self.name = name  # 人和狗都有本身的暱稱;
        self.aggressivity = aggressivity  # 人和狗都有本身的攻擊力;
        self.life_value = life_value  # 人和狗都有本身的生命值;

    def eat(self): print('%s is eating'%self.name) class Dog(Animal): ''' 狗類,繼承Animal類 '''
    def bite(self, people): ''' 派生:狗有咬人的技能 :param people: ''' people.life_value -= self.aggressivity class Person(Animal): ''' 人類,繼承Animal '''
    def attack(self, dog): ''' 派生:人有攻擊的技能 :param dog: ''' dog.life_value -= self.aggressivity egg = Person('egon',10,1000) ha2 = Dog('二愣子',50,1000) print(ha2.life_value) print(egg.attack(ha2)) print(ha2.life_value)

  注意:像ha2.life_value之類的屬性引用,會先從實例中找life_value而後去類中找,而後再去父類中找...直到最頂級的父類。

  在子類中,新建的重名的函數屬性,在編輯函數內功能的時候,有可能須要重用父類中重名的那個函數功能,應該是用調用普通函數的方式,即:類名.func(),此時就與調用普通函數無異了,所以即使是self參數也要爲其傳值.

  在python3中,子類執行父類的方法也能夠直接用super方法.

(1)supper

class A: def hahaha(self): print('A') class B(A): def hahaha(self): super().hahaha() #super(B,self).hahaha()
        #A.hahaha(self)
        print('B') a = A() b = B() b.hahaha() super(B,b).hahaha()

(2)人狗大戰

class Animal: ''' 人和狗都是動物,因此創造一個Animal基類 '''
    def __init__(self, name, aggressivity, life_value): self.name = name  # 人和狗都有本身的暱稱;
        self.aggressivity = aggressivity  # 人和狗都有本身的攻擊力;
        self.life_value = life_value  # 人和狗都有本身的生命值;

    def eat(self): print('%s is eating'%self.name) class Dog(Animal): ''' 狗類,繼承Animal類 '''
    def __init__(self,name,breed,aggressivity,life_value): super().__init__(name, aggressivity, life_value) #執行父類Animal的init方法
        self.breed = breed  #派生出了新的屬性

    def bite(self, people): ''' 派生出了新的技能:狗有咬人的技能 :param people: ''' people.life_value -= self.aggressivity def eat(self): # Animal.eat(self)
        #super().eat()
        print('from Dog') class Person(Animal): ''' 人類,繼承Animal '''
    def __init__(self,name,aggressivity, life_value,money): #Animal.__init__(self, name, aggressivity, life_value)
        #super(Person, self).__init__(name, aggressivity, life_value)
        super().__init__(name,aggressivity, life_value)  #執行父類的init方法
        self.money = money   #派生出了新的屬性

    def attack(self, dog): ''' 派生出了新的技能:人有攻擊的技能 :param dog: ''' dog.life_value -= self.aggressivity def eat(self): #super().eat()
 Animal.eat(self) print('from Person') egg = Person('egon',10,1000,600) ha2 = Dog('二愣子','哈士奇',10,1000) print(egg.name) print(ha2.name) egg.eat()

  

  經過繼承創建了派生類與基類之間的關係,它是一種'是'的關係,好比白馬是馬,人是動物。

  當類之間有不少相同的功能,提取這些共同的功能作成基類,用繼承比較好,好比教授是老師。

>>> class Teacher: ... def __init__(self,name,gender): ... self.name=name ... self.gender=gender ... def teach(self): ... print('teaching') ... >>> 
>>> class Professor(Teacher): ... pass ... >>> p1=Professor('egon','male') >>> p1.teach() teaching 複製代碼
相關文章
相關標籤/搜索