python 基礎之繼承、重寫、多繼承
一、繼承
1、繼承的概念
繼承描述的是一種類間關係,一個類A從另一個類B獲取成員資訊,稱類A繼承自類B。
提供成員資訊的類稱==父類==(基類),獲取成員資訊的類稱子類(派生類)。
2、繼承的作用
子類可以使用父類的成員(成員變數,成員方法)
3、繼承語法格式
class 類名(父類名):
pass
複製程式碼
class Animal:
pass
class Dog(Animal): # Dog 繼承於 Animal
pass
複製程式碼
4、獲取繼承關係圖譜
使用Python內建屬性__mro__可以檢視繼承關係
語法格式:類名.__mro__
複製程式碼
class Animal(object):
pass
class Dog(Animal): # Dog 繼承於 Animal
pass
print(Animal.__mro__)
print(Dog.__mro__)
複製程式碼
執行結果:
"F:\Program Files\Python36\python.exe" H:/python_projects/aircraft_battle/test2.py
(<class '__main__.Animal'>, <class 'object'>)
(<class '__main__.Dog'>, <class '__main__.Animal'>, <class 'object'>)
複製程式碼
5、注意事項
- 子類可以添父類沒有的成員
- 父類私有成員不可被繼承
二、重寫
1、重寫的概念
重寫指的是:在子類中定義與父類相同名稱的成員方法。
2、重寫的作用
- 子類對父類的成員方法進行重寫後,使用子類物件呼叫該方法時,將執行子類中重寫後的方法
class Animal(object):
def eat(self):
print("動物需要吃東西")
class Dog(Animal):
def eat(self): # eat 是對父類中的 eat 的重寫
print("狗喜歡吃骨頭")
dog1 = Dog()
dog1.eat()
複製程式碼
3、在子類訪問父類被重寫的方法
格式一:
父類名.方法名(物件)
格式二:
super(本類名,物件).方法名()
格式三:
super().方法名()
複製程式碼
class Animal(object): # object 是所有類的父類
def eat(self):
print("動物需要吃東西")
class Dog(Animal): # Dog 是Animal的子類,繼承於Animal
def eat(self):
print("狗喜歡吃骨頭")
# 格式一:父類名.方法名(物件)
Animal.eat(self)
# 格式二:super(本類名,物件).方法名()
super(Dog, self).eat()
# 格式三:super().方法名()
super().eat()
dog1 = Dog()
dog1.eat()
複製程式碼
三、多繼承
1、多繼承的概念
- 一個類同時繼承多個類
2、定義多繼承語法格式
class 類名(父類名1,父類名2···):
pass
複製程式碼
class Animal(object):
pass
class Mammal(object):
pass
class Dog(Animal, Mammal): # Dog 同時繼承於
pass
複製程式碼
3、多繼承關係中訪問父類成員衝突
多繼承關係中,當多個父類具有同名的成員,子類調時該成員時先呼叫繼承關係中的第一個宣告的類的成員。
四、多型
1、多型的概念
一個物件具有多種形態,在不同的使用環境中以不同的形態展示其功能,稱該物件具有多型特徵。
2、鴨子型別
鴨子型別是一種特殊的呼叫現象,當物件在語法層面能夠滿足呼叫關係,但物件並不具有對應的物件形態,稱該物件此時具備鴨子型別
鴨子型別是一種特殊的多型表現形式
複製程式碼
3、注意事項
- 多型通常發生在繼承關係的基礎之上。
反恐精英
"""
演示反恐精英案例——超級加強版
對三個匪徒
加入開槍射擊命中概率
加入開槍傷害值波動
加入鞭屍文字顯示效果
分析:
-----------------------基礎版-----------------------
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.加入鞭屍文字顯示效果
17.修復死亡後還能繼續開槍
"""
import random
# 定義一個父類 Human
class Human:
def __init__(self, name): # 初始化人物生命值的狀態
self.life = 100
self.name = name
def __str__(self):
"""用 def __str__ (self): 加上裡面的 if elif ....else 來返回遊戲人物的狀態"""
if self.life == 100:
num = "無傷"
return "%s暫時%s,剩餘生命值是:%s" % (self.name, num, self.life)
elif self.life >= 70:
num = "輕傷"
return "%s已經受了%s,剩餘生命值是:%s" % (self.name, num, self.life)
elif self.life >= 1:
num = "重傷"
return "%s已經受了%s,剩餘生命值是:%s" % (self.name, num, self.life)
else:
num = "不行了"
return "%s已經%s,剩餘生命值是:%s" % (self.name, num, self.life)
# 定義一個子類 Hero 繼承於父類 Human 用於定義英雄這一角色。
# hurt 用於表示每次受到的傷害
class Hero(Human):
def fire(self, p):
hurt1 = 40
lucky = random.randint(1, 100)
if lucky >= 1:
hurt1 =100
print("恭喜%s獲得98k,無人能擋"% self.name)
root = random.randint(1, 100)
if root >= 1:
if p.life < hurt1:
p.life = 0
print("%s已經死了,請不要鞭屍了" % p.name)
else:
p.life = p.life - hurt1
print("%s向%s開槍,造成了%d點的傷害" % (self.name, p.name, hurt1))
else:
print("%s的槍法真差,沒打中,真是浪費子彈" % self.name)
# 定義一個子類 Terrorist 繼承於父類 Human 用於定義恐怖分子
class Terrorist(Human):
def fire(self, p):
hurt = 10
# 用隨機數函式,random.randint() 加上 if 語句來控制開槍,也就相當於命中率
root = random.randint(1, 100)
if root >= 80:
if p.life < hurt:
p.life = 0
print("%s已經死了,請不要鞭屍了" % p.name)
else:
p.life = p.life - hurt
print("%s向%s開槍,造成了%d點的傷害" % (self.name, p.name, hurt))
else:
print("%s的槍法真差,沒打中,真是浪費子彈" % self.name)
# 主函式 控制人物開槍
def main():
hero1 = Hero("**英雄**")
terrorist1 = Terrorist("@恐怖分子@")
terrorist2 = Terrorist("@恐怖分子的兒子@")
terrorist3 = Terrorist("@恐怖分子的女兒@")
# terrorist14 = Terrorist(" ")
while True:
x = random.randint(1, 3)
if hero1.life >= 0:
if x == 1 and terrorist2.life > 0:
hero1.fire(terrorist1)
elif x == 2 and terrorist2.life > 0:
hero1.fire(terrorist2)
elif x == 3 and terrorist2.life > 0:
hero1.fire(terrorist3)
if terrorist1.life > 0:
terrorist1.fire(hero1)
if terrorist2.life > 0:
terrorist2.fire(hero1)
if terrorist3.life > 0:
terrorist3.fire(hero1)
print(hero1)
print(terrorist1)
print(terrorist2)
print(terrorist3)
# 用 if 語句 判斷人物是否死亡
if hero1.life <= 0:
print("%s英勇陣亡,槍戰結束" % hero1.name)
break
if terrorist1.life <= 0 and terrorist2.life <= 0 and terrorist3.life <= 0:
print("恐怖份子全部死亡,槍戰結束")
break
main()
print("第二輪------------------------------------------------")
main()
複製程式碼