Python父子關係——繼承(反恐精英案例,應用與練習)

1. 繼承

1.1 繼承的概念

繼承描述的是一種類間關係,一個類A從另外一個類B獲取成員信息,稱類A繼承自類B。python

提供成員信息的類稱父類(基類),獲取成員信息的類稱子類(派生類)。dom

1.2 繼承的做用

子類可使用父類的成員(成員變量,成員方法)函數

1.3 繼承的語法格式

class 類名(父類名):
    pass
複製代碼

1.4 獲取繼承關係圖譜

使用Python內置屬性__mro__能夠查看繼承關係spa

語法格式:類名.mro3d

說明:mro即Method Resolution Order方法解析順序,全部類都有一個共同的父類boject,來自Python系統默認。

1.5 注意事項

  • 子類能夠添加父類沒有的成員
  • 父類私有成員不可被繼承

2.重寫

2.1 重寫的概念

重寫指在子類中定義與父類相同名稱的成員方法。code

2.2 重寫的做用

子類對父類的成員方法進行重寫後,使用子類對象調用該方法時,將執行子類中重寫後的方法cdn

2.3 在子類中訪問父類被重寫的方法

格式一:父類名.方法名(對象)對象

格式二:super(本類名,對象).方法名 ()blog

(推薦)格式三:super().方法名 ()繼承

3. 多繼承

3.1 多繼承的概念

一個類同時繼承多個類,稱爲多繼承

3.2 定義多繼承語法格式

class 類名(父類名1,父類名2...):
    pass
複製代碼

3.3 多繼承關係中訪問父類成員衝突

多繼承關係中,當多個父類具備同名的成員,子類調時該成員時先調用繼承關係中的第一個聲明的類成員。

4. 多態

4.1 多態的概念

一個對象具備多種形態,字不一樣的使用環境中以不一樣的形態展現其功能,稱該對象具備多態特徵。

例:一我的,既是老師,也是父親,也是司機等。

4.2 鴨子類型

鴨子類型是一種特殊的調用現象,當對象在語法層面可以知足調用關係,但對象並不具備對應的對象形態,稱該對象此時具有鴨子類型。

鴨子類型是一種特殊的多態表現形式。

例:浮在水上的沒飛的鳥,遠觀稱其鴨子,鴨子沒飛,浮在水面。但理論上不是鴨子。

4.3 注意事項

多態一般發生在繼承關係的基礎之上。

案例:反恐精英基礎版

""" 演示反恐精英案例 對一個匪徒 分析: 1.定義人類,描述公共屬性 life:100 name:姓名要傳參 2.定義出英雄與恐怖分子類 3.定義主函數描述槍戰過程 main,建立兩個對象 4.定義開槍方法,分紅兩個方法,Hero Is都有 定義的方法要傳入被射擊的對象 被射擊對象的生命值要進行減小 5.主程序中調用開槍操做 6.開槍操做後,要在主程序中顯示每一個人的狀態信息 7.定義Person類的__str__方法,用於顯示每一個人的狀態 8.設置開槍操做爲反覆操做 再設置中止條件:一方生命值<=0 中止循環使用break """
class Person:  # 定義人類
    def __init__(self,name):  # 定義公有變量名字和hp
        self.name = name
        self.hp = 100

    def __str__(self):      # 返回對應人的當前血量
        return "%s當前生命值爲:%d" % (self.name, self.hp)

class Hero(Person):     # 定義英雄類,定義開槍成員方法
    def fire(self,p):
        damage = 40    # 傷害
        # 誰向誰開槍,只有一個self參數,定義一個形參p,接收開槍和受傷人
        print("%s向%s開槍,形成了%d傷害" % (self.name, p.name, damage))
        p.hp -= damage  # 受傷人hp自減

class Is(Person):  # 同上
    def fire(self,p):
        damage = 10
        print("%s向%s開槍,形成了%d傷害" % (self.name, p.name, damage))
        p.hp -= damage
    
def main():   # 定義主函數
# 定義h對象,同時傳參名字,繼承父類Person的name屬性,調用時顯示
    h = Hero("【英雄】")  
# 定義is1對象,同上
    is1 = Is("【老大】")    
    while True:    # 無限循環
        h.fire(is1)   # 傳參h開火,開火對象是is1
        is1.fire(h)   # 傳參is1開火,開火對象是h
        print(h)
        print(is1)
    # 設置結束條件
        if h.hp <= 0:
            print("%s死亡,槍戰結束" % h.name)
            break
        if is1.hp <= 0:
            print("全部恐怖份子所有死亡,槍戰結束")
            break
main()  # 調用主函數
複製代碼

案例:反恐精英修復版

""" 演示反恐精英案例——修復版 對一個匪徒 分析: -----------------------基礎版----------------------- 1.定義人類,描述公共屬性 life:100 name:姓名要傳參 2.定義出英雄與恐怖分子類 3.定義主函數描述槍戰過程 main,建立兩個對象 4.定義開槍方法,分紅兩個方法,Hero Is都有 定義的方法要傳入被射擊的對象 被射擊對象的生命值要進行減小 5.主程序中調用開槍操做 6.開槍操做後,要在主程序中顯示每一個人的狀態信息 7.定義Person類的__str__方法,用於顯示每一個人的狀態 8.設置開槍操做爲反覆操做 再設置中止條件:一方生命值<=0 中止循環使用break -----------------------修復版----------------------- 9.修復英雄的信息顯示模式 狀態描述 0 - 1- 70 - 99- 100 if..elif.. and組合條件 10.修復生命值爲負的問題 射擊時若是生命值<傷害值,生命值 = 0,不然正常減生命 """
class Person:  # 定義人類
    def __init__(self,name):  # 定義公有變量名字和hp
        self.name = name
        self.hp = 100

    def __str__(self):      # 返回對應人的當前血量
        return "%s當前生命值爲:%d" % (self.name, self.hp)

class Hero(Person):     # 定義英雄類,定義開槍成員方法
    def fire(self,p):
        damage = 40    # 傷害
        # 誰向誰開槍,只有一個self參數,定義一個形參p,接收開槍和受傷人
        print("%s向%s開槍,形成了%d傷害" % (self.name, p.name, damage))
        if p.hp < damage:  # 受傷人的hp小於開槍人的傷害時
            p.hp = 0        # 賦值0,修復出現負生命值狀況
        else:
            p.hp -= damage  # 受傷人hp自減
    
    # 重寫父類的str方法,調用子類英雄時,使用子類中的str
    def __str__(self):     
    # 調用時一定傳的是英雄參數,因此如下self都表明的英雄對象
        # 狀態 state = "?"
        if self.hp == 100:
            state = "無傷"
        elif self.hp >= 70 and self.hp < 100:
            state = "輕傷"
        elif self.hp >= 1 and self.hp < 70:
            state = "重傷"
        elif self.hp >= 0:
            state = "掛了"
        return "%s當前狀態爲:%s" % (self.name, state)  # 返回狀態

class Is(Person):  # 同上
    def fire(self,p):
        damage = 10
        print("%s向%s開槍,形成了%d傷害" % (self.name, p.name, damage))
        if p.hp < damage:  # 受傷人的hp小於開槍人的傷害時
            p.hp = 0        # 賦值0,修復出現負生命值狀況
        else:
            p.hp -= damage  # 受傷人hp自減
    
def main():   # 定義主函數
# 定義h對象,同時傳參名字,繼承父類Person的name屬性,調用時顯示
    h = Hero("【英雄】")  
# 定義is1對象,同上
    is1 = Is("【老大】")    
    while True:    # 無限循環
        h.fire(is1)   # 傳參h開火,開火對象是is1
        is1.fire(h)   # 傳參is1開火,開火對象是h
        print(h)
        print(is1)
        print()   # 打印空行,隔開每輪開槍
    # 設置結束條件
        if h.hp <= 0:
            print("%s死亡,槍戰結束" % h.name)
            break
        if is1.hp <= 0:
            print("全部恐怖份子所有死亡,槍戰結束")
            break
main()  # 調用主函數
複製代碼

案例:反恐精英增強版

""" 演示反恐精英案例——增強版 對三個匪徒 分析: -----------------------基礎版----------------------- 1.定義人類,描述公共屬性 life:100 name:姓名要傳參 2.定義出英雄與恐怖分子類 3.定義主函數描述槍戰過程 main,建立兩個對象 4.定義開槍方法,分紅兩個方法,Hero Is都有 定義的方法要傳入被射擊的對象 被射擊對象的生命值要進行減小 5.主程序中調用開槍操做 6.開槍操做後,要在主程序中顯示每一個人的狀態信息 7.定義Person類的__str__方法,用於顯示每一個人的狀態 8.設置開槍操做爲反覆操做 再設置中止條件:一方生命值<=0 中止循環使用break -----------------------修復版----------------------- 9.修復英雄的信息顯示模式 狀態描述 0 - 1- 70 - 99- 100 if..elif.. and組合條件 10.修復生命值爲負的問題 射擊時若是生命值<傷害值,生命值 = 0,不然正常減生命 -----------------------增強版----------------------- 11.建立三個恐怖份子對象 三個對象都要開槍,三個對象都要打印狀態 12.修復結束條件爲三個恐怖份子都死亡 三個知足同時死亡 and 13.解決向三個恐怖份子開槍的問題 隨機數:random 步驟1:使用random import random 必須寫在全部程序的前面 步驟2:使用random.randint(1,3) 能夠產生1到3的隨機數 產生一個隨機數,判斷是幾就向幾號敵人開槍 """
import random   # 定義random
class Person:  # 定義人類
    def __init__(self,name):  # 定義公有變量名字和hp
        self.name = name
        self.hp = 100

    def __str__(self):      # 返回對應人的當前血量
        return "%s當前生命值爲:%d" % (self.name, self.hp)

class Hero(Person):     # 定義英雄類,定義開槍成員方法
    def fire(self,p):
        damage = 40    # 傷害
        # 誰向誰開槍,只有一個self參數,定義一個形參p,接收開槍和受傷人
        print("%s向%s開槍,形成了%d傷害" % (self.name, p.name, damage))
        if p.hp < damage:  # 受傷人的hp小於開槍人的傷害時
            p.hp = 0        # 賦值0,修復出現負生命值狀況
        else:
            p.hp -= damage  # 受傷人hp自減
    
    # 重寫父類的str方法,調用子類英雄時,使用子類中的str
    def __str__(self):     
    # 調用時一定傳的是英雄參數,因此如下self都表明的英雄對象
        # 狀態 state = "?"
        if self.hp == 100:
            state = "無傷"
        elif self.hp >= 70 and self.hp < 100:
            state = "輕傷"
        elif self.hp >= 1 and self.hp < 70:
            state = "重傷"
        elif self.hp >= 0:
            state = "掛了"
        return "%s當前狀態爲:%s" % (self.name, state)  # 返回狀態

class Is(Person):  # 同上
    def fire(self,p):
        damage = 10
        print("%s向%s開槍,形成了%d傷害" % (self.name, p.name, damage))
        if p.hp < damage:  # 受傷人的hp小於開槍人的傷害時
            p.hp = 0        # 賦值0,修復出現負生命值狀況
        else:
            p.hp -= damage  # 受傷人hp自減
    
def main():   # 定義主函數
# 定義h對象,同時傳參名字,繼承父類Person的name屬性,調用時顯示
    h = Hero("【英雄】")  
# 定義三個恐怖份子對象,同上
    is1 = Is("【老大】")
    is2 = Is("【老二】")
    is3 = Is("【老三】")
    while True:    # 無限循環
        x = random.randint(1,3)   # 隨機產生1-3 
        if x == 1:         # 若是是1,讓英雄向老大開槍
            h.fire(is1)
        elif x == 2:        # 向老二開槍
            h.fire(is2)
        else:                  # 同理
            h.fire(is3)
        is1.fire(h)   # 傳參is1開火,開火對象是h
        is2.fire(h)   # 恐怖分子開火
        is3.fire(h)
        print(h)     # 打印4我的的信息
        print(is1)
        print(is2)
        print(is3)
        print()   # 打印空行,隔開每輪開槍
    # 設置結束條件
        if h.hp <= 0:
            print("%s死亡,槍戰結束" % h.name)
            break
        # 修復恐怖份子結束的條件
        if is1.hp <= 0 and is2.hp <= 0 and is3.hp <= 0:   
            print("全部恐怖份子所有死亡,槍戰結束")
            break
main()  # 調用主函數
複製代碼

恐怖分子人數增長,可適當調低傷害

反恐精英超級增強版

""" 演示反恐精英案例——超級增強版 對三個匪徒 加入開槍射擊命中機率 加入開槍傷害值波動 加入鞭屍文字顯示效果 分析: -----------------------基礎版----------------------- 1.定義人類,描述公共屬性 life:100 name:姓名要傳參 2.定義出英雄與恐怖分子類 3.定義主函數描述槍戰過程 main,建立兩個對象 4.定義開槍方法,分紅兩個方法,Hero Is都有 定義的方法要傳入被射擊的對象 被射擊對象的生命值要進行減小 5.主程序中調用開槍操做 6.開槍操做後,要在主程序中顯示每一個人的狀態信息 7.定義Person類的__str__方法,用於顯示每一個人的狀態 8.設置開槍操做爲反覆操做 再設置中止條件:一方生命值<=0 中止循環使用break -----------------------修復版----------------------- 9.修復英雄的信息顯示模式 狀態描述 0 - 1- 70 - 99- 100 if..elif.. and組合條件 10.修復生命值爲負的問題 射擊時若是生命值<傷害值,生命值 = 0,不然正常減生命 -----------------------增強版----------------------- 11.建立三個恐怖份子對象 三個對象都要開槍,三個對象都要打印狀態 12.修復結束條件爲三個恐怖份子都死亡 三個知足同時死亡 and 13.解決向三個恐怖份子開槍的問題 隨機數:random 步驟1:使用random import random 必須寫在全部程序的前面 步驟2:使用random.randint(1,3) 能夠產生1到3的隨機數 產生一個隨機數,判斷是幾就向幾號敵人開槍 -----------------------超級增強版----------------------- 14.加入開槍射擊命中機率 產生一個隨機數,若是在範圍內,命中,不然不命中 文字效果要變化 兩處開槍都要從新制做 15.加入開槍傷害值波動 產生一個隨機數,做爲傷害值 16.加入鞭屍文字顯示效果 """
import random   # 定義random
class Person:  # 定義人類
    def __init__(self,name):  # 定義公有變量名字和hp
        self.name = name
        self.hp = 100

    def __str__(self):      # 返回對應人的當前血量
        return "%s當前生命值爲:%d" % (self.name, self.hp)

class Hero(Person):     # 定義英雄類,定義開槍成員方法
    def fire(self,p):
    # 加入命中率
        hit = random.randint(1,100)   
        if hit <= 80:    # 命中率80%
            if p.hp == 0:     # 若是受傷人的hp=0,則是鞭屍
                print("你攻擊的是%s屍體,無效" % p.name)
            else:    # 若是不是,傷害也加入隨機數,波動
                damage = random.randint(20,50)    # 20-50隨機傷害
                print("%s向%s開槍,形成了%d傷害" % (self.name, p.name, damage))
                if p.hp < damage:  # 受傷人的hp小於開槍人的傷害時
                    p.hp = 0  # 賦值0,修復出現負生命值狀況
                else:
                    p.hp -= damage  # 受傷人hp自減
        else:
            print("未打中土匪")
    
    # 重寫父類的str方法,調用子類英雄時,使用子類中的str
    def __str__(self):     
    # 調用時一定傳的是英雄參數,因此如下self都表明的英雄對象
        # 狀態 state = "?"
        if self.hp == 100:
            state = "無傷"
        elif self.hp >= 70 and self.hp < 100:
            state = "輕傷"
        elif self.hp >= 1 and self.hp < 70:
            state = "重傷"
        elif self.hp >= 0:
            state = "掛了"
        return "%s當前狀態爲:%s" % (self.name, state)  # 返回狀態

class Is(Person):  # 同上
    def fire(self,p):
    # 加入命中率
        hit = random.randint(1,100)
        damage = random.randint(5,15)
        if hit > 80:
            print("%s向%s開槍,形成了%d傷害" % (self.name, p.name, damage))
            if p.hp < damage:  # 受傷人的hp小於開槍人的傷害時
                p.hp = 0        # 賦值0,修復出現負生命值狀況
            else:
                p.hp -= damage  # 受傷人hp自減
        else:
            print("未打中英雄")
def main():   # 定義主函數
# 定義h對象,同時傳參名字,繼承父類Person的name屬性,調用時顯示
    h = Hero("【英雄】")  
# 定義三個恐怖份子對象,同上
    is1 = Is("【老大】")
    is2 = Is("【老二】")
    is3 = Is("【老三】")
    while True:    # 無限循環
        x = random.randint(1,3)   # 隨機產生1-3 
        if x == 1:         # 若是是1,讓英雄向老大開槍
            h.fire(is1)
        elif x == 2:        # 向老二開槍
            h.fire(is2)
        else:                  # 同理
            h.fire(is3)
        is1.fire(h)   # 傳參is1開火,開火對象是h
        is2.fire(h)   # 恐怖分子開火
        is3.fire(h)
        print(h)     # 打印4我的的信息
        print(is1)
        print(is2)
        print(is3)
        print()   # 打印空行,隔開每輪開槍
    # 設置結束條件
        if h.hp <= 0:
            print("%s死亡,槍戰結束" % h.name)
            break
        # 修復恐怖份子結束的條件
        if is1.hp <= 0 and is2.hp <= 0 and is3.hp <= 0:   
            print("全部恐怖份子所有死亡,槍戰結束")
            break
main()  # 調用主函數
複製代碼
相關文章
相關標籤/搜索