Python - 面向对象编程 - 实战(4)
需求:士兵突进
- 士兵许三多有一把 AK47
- 士兵可以开火
- 枪能够发射子弹
- 枪装填子弹,可以增加子弹数量
需求分析
- 很明显有两个类:士兵类,枪类
- AK47 是枪名,是枪类的属性,每把枪都有子弹数,所以子弹数也是一个属性
- 发生子弹是一个行为,所以是一个方法
- 装填子弹也是一个行为,也是一个方法
- 许三多是姓名,是士兵类的属性;士兵拥有枪,所以枪也是一个属性,对应的是枪类【一个对象的属性可以是另外一个类创建的对象】
- 开火是士兵类的一个行为,所以是一个方法,开火会发射子弹,所以应该调用枪的发射方法
类图

本次实战采用封装思想,将所有属性私有化,并且每个属性都有 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
Python - 面向对象编程 - 实战(4)的更多相关文章
- Python - 面向对象编程 - 实战(6)
需求 设计一个培训机构管理系统,有总部.分校,有学员.老师.员工,实现具体如下需求: 有多个课程,课程要有定价 有多个班级,班级跟课程有关联 有多个学生,学生报名班级,交这个班级对应的课程的费用 有多 ...
- Python - 面向对象编程 - 实战(5)
前言 主要是针对静态方法.类方法.实例方法.类属性.实例属性的混合实战 需求 设计一个 Game 类 属性 定义一个类属性 top_score 记录游戏的历史最高分,这个属性很明显只跟游戏有关,跟实例 ...
- python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
- python 面向对象编程(一)
一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...
- Python面向对象编程指南
Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- Python面向对象编程(下)
本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...
- Python 面向对象编程——访问限制
<无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
随机推荐
- 破解加速乐-java
记录一哈自己遇到的简单站点的破解 Talk is cheap,show you the code! import com.google.gson.Gson; import com.google.gso ...
- HDFS总结
hadoop分布式文件存储系统,用来解决海量数据的存储问题 HDFS的组成------核心配置文件:hdfs-site.xml.core-site.xml NameNode:负责整个HDFS集群的管理 ...
- 4、关于numpy.random.seed()的使用说明
定义:seed( ) 用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed( )值,则每次生成的随即数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差 ...
- MySQL-14-备份恢复
备份类型 1 热备 在业务正常时,对数据库进行备份数据,并且能够一致性恢复(只能是innodb) 对业务影响非常小 2 温备 锁表备份,只能查询不能修改(myisam) 影响到写入操作 3 冷备 关闭 ...
- 【笔记】逻辑回归中使用多项式(sklearn)
在逻辑回归中使用多项式特征以及在sklearn中使用逻辑回归并添加多项式 在逻辑回归中使用多项式特征 在上面提到的直线划分中,很明显有个问题,当样本并没有很好地遵循直线划分(非线性分布)的时候,其预测 ...
- nohup 启动命令
start.sh #!/bin/bash nohup $PWD/node_exporter > /dev/null 2>&1 &
- pikachu RCE远程系统命令执行
远程系统命令执行 一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口比如我们常见的路由器.防火墙.入侵检测等设备的web管理界面上一般会给用户提供一个ping操作的web界 ...
- Centos7上安装最新的nodejs
下载nodejs包 安装wget yum install -y wget 下载nodejs到/usr/local/nodejs/下 https://cdn.npm.taobao.org/dist/no ...
- js函数聚合
//掺杂类实现聚合(有的时候,我们需要某个或多个类里的一些方法函数) //将要被聚合的函数 var JSON = { toJsonString: function () { var output = ...
- 【RPC】远程接口调用实例 的几种方式比较
pring中,用JMS搞RPC时会用到: org.springframework.jms.remoting.JmsInvokerServiceExporter org.springframework. ...