python 基础之继承、重写、多继承

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()
复制代码

转载于:https://juejin.im/post/5c150c5ae51d4545de29659f

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值