Python - 面向对象编程 - 实战(4)

简介: Python - 面向对象编程 - 实战(4)

需求:士兵突进


  • 士兵许三多有一把 AK47
  • 士兵可以开火
  • 枪能够发射子弹
  • 枪装填子弹,可以增加子弹数量

 

需求分析


  • 很明显有两个类:士兵类,枪类
  • AK47 是枪名,是枪类的属性,每把枪都有子弹数,所以子弹数也是一个属性
  • 发生子弹是一个行为,所以是一个方法
  • 装填子弹也是一个行为,也是一个方法
  • 许三多是姓名,是士兵类的属性;士兵拥有,所以枪也是一个属性,对应的是枪类【一个对象的属性可以是另外一个类创建的对象】
  • 开火是士兵类的一个行为,所以是一个方法,开火会发射子弹,所以应该调用枪的发射方法

 

类图


image.png


本次实战采用封装思想,将所有属性私有化,并且每个属性都有 setter、getter 方法

 

代码实现


  • 面向对象编程的第一步:将属性和方法封装到一个抽象的类中
  • 外接使用类创建对象,然后让对象调用方法
  • 对象方法的细节都被封装在类的内部

 

先开发枪类还是士兵类?

枪类,因为士兵类依赖枪类,被依赖的类应该优先开发

 

枪类

假设每把枪一开始都没子弹,需要先手动装弹

class Gun:
    # 构造方法
    def __init__(self, name):
        # 封装 - 将实例属性私有化
        self.__name = name
        self.__bullet_count = 0
    # 自定义打印对象方法
    def __str__(self):
        return f"枪名:{self.__name} 子弹数:{self.__bullet_count}"
    # name - getter
    @property
    def name(self):
        return self.__name
    # name - setter
    @name.setter
    def name(self, name):
        self.__name = name
    # count - getter
    @property
    def bulletCount(self):
        return self.__bullet_count
    # count - setter 相当于装子弹
    @bulletCount.setter
    def bulletCount(self, count):
        self.__bullet_count += count
    # shot 发射
    def shoot(self):
        # 1、判断是否能发射
        if self.__bullet_count <= 0:
            print(f"{self.__name} 没有子弹了,请先装弹")
            return
        # 2、发射
        print(f"枪名:{self.__name} 发射")
        # 3、减少子弹
        self.__bullet_count -= 1


士兵类

假设每一个新兵一开始都没有枪

class Solider:
    # 构造方法
    def __init__(self, name):
        self.__name = name
        # 默认没有枪
        self.__gun = None
    # 自定义打印对象方法
    def __str__(self):
        return f"士兵名字:{self.__name} 拿着一把:{self.__gun.name}"
    # name - getter
    @property
    def name(self):
        return self.__name
    # name - setter
    @name.setter
    def name(self, name):
        self.__name = name
    # gun - getter
    @property
    def gun(self):
        return self.__gun
    @gun.setter
    def gun(self, gun):
        self.__gun = gun
    def fire(self):
        # 1、先判断是有枪
        if self.__gun is None:
            print(f"{self.__name} 士兵没有枪,不能发射!!请先装备枪!!")
            return
        # 2、有枪也要有子弹呀!上膛!
        self.__gun.bulletCount += 10
        # 3、拿枪射击!
        self.__gun.shoot()


拿枪射击,其实是

 

执行代码块

# 声明一个枪
ak47 = Gun("ak47")
print(ak47)
# 声明一个士兵
xusanduo = Solider("许三多")
# 给士兵带上 AK47!
xusanduo.gun = ak47
# 开火!
xusanduo.fire()
print(xusanduo)
# 输出结果
枪名:ak47 子弹数:0
枪名:ak47 发射
士兵名字:许三多 拿着一把:ak47
相关文章
|
20天前
|
存储 机器学习/深度学习 数据处理
NumPy:从初识到实战,探索Python科学计算的无限可能
NumPy:从初识到实战,探索Python科学计算的无限可能
38 0
|
20天前
|
Python Windows
【Python进阶必备】一文掌握re库:实战正则表达式
【Python进阶必备】一文掌握re库:实战正则表达式
12 0
|
22天前
|
中间件 数据库连接 API
Python面试:FastAPI框架原理与实战
【4月更文挑战第18天】FastAPI是受欢迎的高性能Python Web框架,以其简洁的API设计、强大的类型提示和优秀的文档生成能力著称。本文将探讨FastAPI面试中的常见问题,包括路由、响应对象、Pydantic模型、数据库操作、中间件和错误处理。同时,还会指出一些易错点,如类型提示不准确、依赖注入误解,并提供实战代码示例。通过理解和实践FastAPI,可以在面试中展示出色的Web开发技能。
29 1
|
2天前
|
Python
【Python进阶(三)】——面向对象编程
【Python进阶(三)】——面向对象编程
|
2天前
|
机器学习/深度学习 Python
【Python实战】——神经网络识别手写数字(三)
【Python实战】——神经网络识别手写数字
|
2天前
|
机器学习/深度学习 数据可视化 Python
【Python实战】——神经网络识别手写数字(二)
【Python实战】——神经网络识别手写数字(三)
|
2天前
|
机器学习/深度学习 数据可视化 Python
【Python实战】——神经网络识别手写数字(一)
【Python实战】——神经网络识别手写数字
|
2天前
|
计算机视觉 Python
【Python实战】——Python+Opencv是实现车牌自动识别
【Python实战】——Python+Opencv是实现车牌自动识别
|
5天前
|
数据采集 数据可视化 数据挖掘
Python 与 PySpark数据分析实战指南:解锁数据洞见
Python 与 PySpark数据分析实战指南:解锁数据洞见
|
5天前
|
机器学习/深度学习 人工智能 大数据
AI时代Python金融大数据分析实战:ChatGPT让金融大数据分析插上翅膀
AI时代Python金融大数据分析实战:ChatGPT让金融大数据分析插上翅膀