面向对象编程二 继承、多态、魔法方法

继承:

继承是一种创建新类的方式,当子类需要复用父类的属性或者方法时,就可以使用继承。同样,子类也可以提供自己的属性和方法
继承分为——单继承、多继承
继承作用:避免重复造轮子,导致代码冗余
在 Python3 当中,全部都是新式类,默认继承 object
单继承:子类继承父类,可以直接享受父类中已经封装好的方法。
注意:
1、单继承:深度优先
2、重写:防止执行父类当中的方法
3、self永远指的是执行该方法的调用者
4、super(当前类, self).父类中的方法(arg)

多继承:所谓多继承,即子类有多个父类,并且具有它们的特征。
python支持多继承:
- 1、左边优先
- 2、一条道路走到底
- 3、同一个根时,根最后执行

多态:

python本身就是动态语言。
多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚"鸭子类型"
动态语言调用实例方法时不检查类型,只要方法存在,参数正确,就可以调用。这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。
所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态。

魔法方法:

在Python中,有一些内置好的特定方法,这些方法在进行特定的操作时会自动被调用,称为魔法方法。
魔法方法的命名总是被双下划线包围,比如__名称__
常用魔法方法:
init
str
mro
main
doc :用来查看类的说明文档
module:查看当前类所在模块
class:查看所属对象
dict:用于获取类或者实例的属性字典
dir():列表,返回所有的成员(dict__更倾向于__dir()的子集
del():叫做析构方法。当由该类创建的实例对象,被删除或者说在内存中被释放,将会自动触发执行。
call():用于将对象变成一个可调用的对象。也就是说,当一个类中有__call__()方法时,其实例化得到的对象便是可调用的(callable)
new():用于创建与返回一个对象。在类准备将自身实例化时调用。

练习一:

"""
士兵老Amy有一把枪(AK47), 
士兵可以开火
枪能够发射子弹
枪能够添加子弹
枪类: 属性:型号,子弹数量 行为:发射子弹,添加子弹
士兵类:
属性:士兵名称,枪支
行为:开火行为(需考虑到:是否有枪支?以及添加子弹,发射子弹)
"""
class Gun(object):
    def __init__(self):
        self.model = None
        self.bullet_num = 0
        self.max_bullet_num = 0

    def __str__(self):
        return f"枪支型号:{self.model}, 当前子弹数量:{self.bullet_num}, 最大子弹数量:{self.max_bullet_num}"

    def Charater(self, model, bullet_num, max_num):
        self.model = model
        self.bullet_num = bullet_num
        self.max_bullet_num = max_num

    def __Addition(self, number):
        addition = input("是否添加子弹:Y/N:")
        max_bullet_num = self.max_bullet_num
        if addition.upper() == 'Y':
            Add = number
            New_bullet_num = self.bullet_num + Add
            if New_bullet_num <= max_bullet_num:
                self.bullet_num = New_bullet_num
                print(f"添加子弹成功,当前子弹数为{self.bullet_num}")
            elif New_bullet_num > max_bullet_num:
                print("子弹添加数量超过最大值")
            else:
                print("输入错误")


    def active(self, number = 0):
        if self.bullet_num > 0 and self.bullet_num <= self.max_bullet_num:
            print(f"{self.model}有子弹,可发射子弹")
            shooting = input("是否发射子弹:Y/N")
            if shooting.upper() == 'Y':
                self.bullet_num -= 1
            else:
                self.bullet_num -= 0
            self.__Addition(number)

        elif self.bullet_num == 0:
            print("空枪,无法发射子弹")
            self.__Addition(number)

        else:
            print("子弹数目有误")

class Soldier(object):
    gun = Gun()
    gun_model = input("请输入枪支类型:")
    gun_bullet_num = int(input("请输入当前子弹数:"))
    gun_max_bullet_num = int(input("请输入最大子弹数:"))
    gun.Charater(gun_model, gun_bullet_num, gun_max_bullet_num)
    print(gun)
    def __init__(self, name=None):
        self.name = name

    def active(self):
        if self.name is None:
            print("连人都没有,打什么打")
        else:
            if Soldier.gun_model is None:
                print("连枪都没有,打什么打")
            else:
                while True:
                    if Soldier.gun_bullet_num == 0:
                        print("连子弹都没有,打什么打")
                        bullet_num = int(input("请输入添弹数量(0-6):"))
                        Soldier.gun.active(bullet_num)
                        Soldier.gun_bullet_num = Soldier.gun_bullet_num + bullet_num
                        continue
                    else:
                        print("开火!开火!!")
                        Soldier.gun.active()
                        Fight = input("继续战斗吗?Y/N:")
                        if Fight.upper() == "Y":
                            continue
                        else:
                            break
                        break

if __name__ == '__main__':
    solider = Soldier(input("请输入士兵名称:"))
    solider.active()

在这里插入图片描述

练习二:

"""
车类1:
属性:颜色,轮子个数(默认4个),重量级,速度(默认为0)
行为:加速,减速,停车
车类2:
属性:在基于车类1的基础上,添加一些比如:牌子,型号,空调系统等
行为:覆盖车类1的加速与减速,打印输出车辆信息
"""

class Vehicle_1(object):
    def __init__(self, color=None, weight=None, tyres = 4, speed = 0):
        self.color = color
        self.tyres = tyres
        self.weight = weight
        self.speed = speed

    @ staticmethod
    def accelerate():
        print("汽车加速!")

    @ staticmethod
    def decelerate():
        print("汽车减速!")

    @ staticmethod
    def stop():
        print("停车!")


class Vehicle_2(Vehicle_1):
    def __init__(self, brand, model, air_conditioner, color=None, weight=None, tyres=4, speed=0):
        self.brand = brand
        self.model = model
        self.air_conditioner = air_conditioner
        super().__init__(color, weight, tyres, speed)

    def accelerate(self, upper_speed):
        speed_upper = upper_speed
        print(f"{self.brand}加速{speed_upper}")
        self.speed += speed_upper
        print(f"当前车速{self.speed}")

    def decelerate(self, low_speed):
        speed_lower = low_speed
        print(f"{self.brand}减速{speed_lower}")
        self.speed -= speed_lower
        print(f"当前车速{self.speed}")

    def __str__(self):
        return f"车牌:{self.brand}\n型号:{self.model}\n空调系统:{self.air_conditioner}\n颜色:{self.color}\n重量:{self.weight}\n轮胎数:{self.tyres}\n速度:{self.speed}"

if __name__ == '__main__':
    Car = Vehicle_2("京A8888", 'X3', '自动调节', '宝石蓝', 5, 4, 80)
    print(Car)
    Car.accelerate(20)
    Car.decelerate(10)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值