Python 基礎之面向對象類的繼承與多態

一.繼承

定義:一個類除了擁有自身的屬性方法以外,還擁有另一個類的屬性和方法
繼承: 1.單繼承 2.多繼承
子類: 一個類繼承了另一個類,那麼這個類是子類(衍生類)
父類:一個類繼承了另一個類,被繼承的那個類是父類(超類,基類)
object 是全部的類的父類
算法

1.單繼承

#:
class Human():
    def eat(self):
        print("遠古人類打獵,吃獵物")

    def sleep(self):

        print("遠古人類吃飽了就睡覺")

    def __beat_doudou(self):
        print("遠古人類起來先打豆豆,再打獵")
#把要繼承的類放到class 定義類的這個括號裏面寫函數

(1) 子類能夠調用父類的公有成員(方法,屬性)

#:spa

class Man(Human):
    pass
#實例化對象
obj = Man()
obj.eat()對象

(2)子類不能夠調用父類私有成員(方法,屬性)

#:繼承

class Woman(Human):
    def myskill(self):
        #調用父類公有方法
        self.eat()
        #不可以在子類裏面調用父類私有方法
        #self>__beat_doudou()
obj = Woman()
#obj.__beat_doudou() 私有的無法再類外調用
obj.myskill()作用域

(3)子類能夠改造父類的公有方法

子父繼承以後,若是調用的成員
    子類裏面有,優先調用子類的
    子類裏面沒有,就調用父類input

#:
class Children(Human):
    #對eat方法進行改寫
        def eat(self):
            print("小孩生下來只會喝奶")
obj = Children()
obj.eat()class

2.多繼承

(1)基本語法

#:
class Father():
    f_property = "風流倜儻,英俊瀟灑"
    def f_hobby(self):
        print("喜歡跑步")
class Mother():
    m_property = "沉魚落雁,閉月羞花"
    def m_hobby(self):
        print("喜歡作菜")
#多繼承:在括號裏面用逗號,把多個父類隔開
class Daughter(Father,Mother):
    pass
obj = Daughter()
print(obj.f_property)
obj.m_hobby()object

(2)調用父類

class Father():
    f_property = "風流倜儻,英俊瀟灑"
    def f_hobby():
        print("喜歡跑步")
class Mother():
    m_property = "沉魚落雁,閉月羞花"

    def m_hobby(self):
        print("喜歡作菜")
class Son(Father,Mother):
    #f_property = "子類的屬性f_property"
    #(1)經過類的方式調用父類的相關成員
    def skill1(self):
        #調用Father的f_hobby
        Father.f_hobby()
        #調用Mother中的m_property
        print(Mother.m_property)

    #(2)經過對象的方式調用父類的相關成員
    def skill2(self):
        #調用Father中的f_property
        print(self.f_property)
        #調用Mother中的m_hobby
        self.m_hobby()

    #(3)使用super調用父類的相關成員
    def skill3(self):
        # 調用Father中的f_property
        #super() 必定調用的是父類的,區別於self
        #print(super().f_property)
        #super().f_hobby() error super() 調用的是綁定方法,默認傳遞self參數
        super().m_hobby()
print("============")
obj = Son()
obj.skill1()
#obj.skill2()
obj.skill3()語法

#關於super的概念

(1)super 自己是一個類,super()是一個對象,用於調用父類的綁定方法
(2)super() 只應用在綁定方法中,默認自動傳遞self對象(前提:super所在做用域存在self)
(3)super用途:解決複雜的多繼承調用順序

3.菱形繼承

#菱形繼承就是廣度優先算法的方式繼承父類函數
#:下面是關於例1中的繼承關係


    Human


Man       Woman


    Children
#:
class Human():
    pty = 111
    def feelT(self):
        print("遠古人類天熱了1")
        print(self.pty)
        print("遠古人天冷了2")
class Man(Human):
    pty = 222
    def feelT(self):
        print("現代男性天氣熱了3")
        super().feelT()
        print("現代男性天冷了4")

class Woman(Human):
    pty = 333
    def feelT(self):
        print("現代女性天熱了5")
        super().feelT()
        print("現代女性天冷了6")

class Children(Man,Woman):
    pty = 444
    def feelT(self):
        print("小孩天熱了7")
        super().feelT()
        print("小孩天冷了8")

obj = Children()
obj.feelT()
#c.f => 7
#M.f =>3
"""
#mro 列表:經過c3算法,把全部的繼承關係按照列表的順序呈現
#語法:
#類.mro() => 繼承順序列表
[<class '__main__.Children'>,
<class '__main__.Man'>,
 <class '__main__.Woman'>,
 <class '__main__.Human'>,
 <class 'object'>]
super 就是默認按照mro列表的順序,依次調用
用於解決多繼承調用順序混亂的問題
"""

lst = Children.mro()
print(lst)

#判斷是不是子父關係 [有血緣關係便可] issubclass
res = issubclass(Children,Man)
res = issubclass(Children,Human)
#知足一個條件,即返回真
res = issubclass(Children,(Man,Woman))
print(res)
#判斷對象的類型, [有血緣關係便可] isinstance
res = isinstance(obj,Children)
res = isinstance(obj,Man)
res = isinstance(obj,(Human,Woman))
print(res)

 

二.多態(不一樣的對象)

不一樣的子類對象,調用相同的父類方法,產生不一樣的執行結果
特徵:繼承  重寫
好處:在不改變代碼的前提下,實現代碼的複用,和不一樣的效果
#:
class Soldier():
    #攻擊
    def attack(self):
        pass
    #撤退
    def back(self):
        pass
#陸軍
class Army(Soldier):
    def attack(self):
        print("[陸軍]使用坦克進攻轟炸")

    def back(self):
        print("[陸軍]使用軍車進行撤退")
#海軍
class Navy(Soldier):
    def attack(self):
        print("[海軍]使用魚雷攻擊")

    def back(self):
        print("[陸軍]開啓防護魚雷模式")
#空軍
class Airforce(Soldier):
    def attack(self):
        print("[空軍]炮彈襲擊")

    def back(self):
        print("[空軍]降落防空基地")
#實例化各個兵種,各就位準備
obj_army = Army()
obj_navy = Navy()
obj_airforce = Airforce()
lst = [obj_army,obj_navy,obj_airforce]

#等待將軍下發命令strvar = """您好將軍,下面是您的操做按鈕:    1.全體出擊    2.全體撤退    3.陸軍出擊,其餘人撤退    4.退出程序"""sign = Truewhile sign:    print(strvar)    num = input("將軍請下令:")    for i in lst:        if num == "1":            i.attack()        elif num == "2":            i.back()        elif num == "3":            if isinstance(i,Army):                i.attack()            else:                i.back()        elif num == "4" or num.upper() == "Q":            sign = False            break        else:            print("風太大,我聽不到")            break

相關文章
相關標籤/搜索