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

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

1、繼承

一、繼承的概念

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

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

二、繼承的做用

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

三、繼承語法格式

class 類名(父類名):
    pass
複製代碼
class Animal:
    pass
class Dog(Animal):  # Dog 繼承於 Animal
    pass
複製代碼

四、獲取繼承關係圖譜

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

語法格式:類名.__mro__
複製代碼
class Animal(object):
    pass
class Dog(Animal): # Dog 繼承於 Animal
    pass
print(Animal.__mro__)
print(Dog.__mro__)
複製代碼

運行結果:ui

"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'>)

複製代碼

五、注意事項

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

2、重寫

一、重寫的概念

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

二、重寫的做用

  • 子類對父類的成員方法進行重寫後,使用子類對象調用該方法時,將執行子類中重寫後的方法
class Animal(object):
    def eat(self):
        print("動物須要吃東西")


class Dog(Animal):
    def eat(self): # eat 是對父類中的 eat 的重寫
        print("狗喜歡吃骨頭")


dog1 = Dog()
dog1.eat()
複製代碼

三、在子類訪問父類被重寫的方法

格式一:
父類名.方法名(對象)
格式二:
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()
複製代碼

3、多繼承

一、多繼承的概念

  • 一個類同時繼承多個類

二、定義多繼承語法格式

class 類名(父類名1,父類名2···):
    pass
複製代碼
class Animal(object):
    pass

class Mammal(object):
    pass

class Dog(Animal, Mammal): # Dog 同時繼承於 
    pass

複製代碼

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

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

4、多態

一、多態的概念

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

二、鴨子類型

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

三、注意事項

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

反恐精英

""" 演示反恐精英案例——超級增強版 對三個匪徒 加入開槍射擊命中機率 加入開槍傷害值波動 加入鞭屍文字顯示效果 分析: -----------------------基礎版----------------------- 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()
複製代碼
相關文章
相關標籤/搜索