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 ...
随机推荐
- thinkPHP5 5.0.23 远程代码执行漏洞
修改数据包 POST /index.php?s=captcha HTTP/1.1 Host: 192.168.49.2:8080 User-Agent: Mozilla/5.0 (Macintosh; ...
- 利用 cgroup 的 cpuset 控制器限制进程的 CPU 使用
最近在做一些性能测试的事情,首要前提是控制住 CPU 的使用量.最直观的方法无疑是安装 Docker,在每个配置了参数的容器里运行基准程序. 对于计算密集型任务,在只限制 CPU 的需求下,直接用 L ...
- DNS服务器(一)正向解析
一.DNS简介 在日常生活中人们习惯便用域名访问服务器,但机器间互相只认IP地址,域名与1P地址之间是多对一的关系,一个ip地址不一定只对应一个域名,且一个域名只可以对应一个ip地址,它们之间的转换工 ...
- 2020年度钻石C++C学习笔记(2)--《博学谷》
2020年度钻石C++C--<博学谷> 1.以下标示符中命名合法的是A A.__A__ B.ab.c C.@rp D.2Y_ 2.设 a 和 b 均为 double 型变量,且a=5.5. ...
- 原生ajax练习-post&xml
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- PHP构造函数__construct()
(!注意,__construct()前的"__"是两个"_",也就是"_ _") 在PHP5.0后的版本,允许开发者设定一个构造函数,来初始 ...
- 雪花算法ID在前端丢失精度解决方案
首先说一下背景,目前笔者的工作是物联网方面的,设备有对应的智慧运营平台,平台开发中建表的主键用的是Mybatis plus默认的雪花算法来生成的,也就是分布式系统比较常用的雪花ID,技术栈就是常用的S ...
- 『Java』成员内部类 匿名内部类
成员内部类 成员方法类是定义在一个类中的方法外的类,例如: public class Outer{ // 外部类 class Inner { // 内部类 // 内部类成员 } // 外部类成员 } ...
- springboot:使用异步注解@Async的那些坑
springboot:使用异步注解@Async的那些坑 一.引言 在java后端开发中经常会碰到处理多个任务的情况,比如一个方法中要调用多个请求,然后把多个请求的结果合并后统一返回,一般情况下调用其他 ...
- 理解SpingAOP
目录 什么是AOP? AOP术语 通知(Advice) 连接点(Join point) 切点(Pointcut) 连接点和切点的区别 切面(Aspect) 引入(Introduction) 织入(We ...