python 基礎之繼承、重寫、多繼承

python小胡發表於2018-12-15

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()
複製程式碼

相關文章