Python父子關係——繼承(反恐精英案例,應用與練習)!
繼承描述的是一種類間關係,一個類A從另一個類B獲取成員資訊,稱類A繼承自類B。
提供成員資訊的類稱父類(基類),獲取成員資訊的類稱子類(派生類)。
1.2 繼承的作用
子類可以使用父類的成員(成員變數,成員方法)
1.3 繼承的語法格式
class 類名(父類名): pass 複製程式碼
進群:960410445 即可獲取數十套PDF以及大量的學習教程哦!
1.4 獲取繼承關係圖譜
使用Python內建屬性__mro__可以檢視繼承關係
語法格式:類名. mro
說明:mro即Method Resolution Order方法解析順序,所有類都有一個共同的父類boject,來自Python系統預設。
1.5 注意事項
- 子類可以新增父類沒有的成員
- 父類私有成員不可被繼承
2.重寫
2.1 重寫的概念
重寫指在子類中定義與父類相同名稱的成員方法。
2.2 重寫的作用
子類對父類的成員方法進行重寫後,使用子類物件呼叫該方法時,將執行子類中重寫後的方法
2.3 在子類中訪問父類被重寫的方法
格式一:父類名.方法名(物件)
格式二:super(本類名,物件).方法名 ()
(推薦)格式三: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() # 呼叫主函式 複製程式碼