# 面向对象封装案例 II
## 目标
- 士兵突击案例
- 身份运算符
**封装**
1. **封装** 是面向对象编程的一大特点
2. 面向对象编程的 **第一步** —— 将 **属性** 和 **方法** **封装** 到一个抽象的 **类** 中
3. **外界** 使用 **类** 创建 **对象**,然后 **让对象调用方法**
4. **对象方法的细节** 都被 **封装** 在 **类的内部**
> 一个对象的 **属性** 可以是 **另外一个类创建的对象**
## 01. 士兵突击
**需求**
1. **士兵** **许三多** 有一把 **AK47**
2. **士兵** 可以 **开火**
3. **枪** 能够 **发射** 子弹
4. **枪** 装填 **装填子弹** —— **增加子弹数量**
![](https://pic.downk.cc/item/5e884682504f4bcb04af91c3.jpg)
### 1.1 开发枪类
**`shoot` 方法需求**
- 1> 判断是否有子弹,没有子弹无法射击
- 2> 使用 `print` 提示射击,并且输出子弹数量
```python
class Gun:
def __init__(self, model):
# 枪的型号
self.model = model
# 子弹数量
self.bullet_count = 0
def add_bullet(self, count):
self.bullet_count += count
def shoot(self):
# 判断是否还有子弹
if self.bullet_count <= 0:
print("没有子弹了...")
return
# 发射一颗子弹
self.bullet_count -= 1
print("%s 发射子弹[%d]..." % (self.model, self.bullet_count))
# 创建枪对象
ak47 = Gun("ak47")
ak47.add_bullet(50)
ak47.shoot()
```
### 1.2 开发士兵类
> 假设:每一个新兵 都 **没有枪**
**定义没有初始值的属性**
在定义属性时,如果 **不知道设置什么初始值**,可以设置为 `None`
- `None` **关键字** 表示 **什么都没有**
- 表示一个 **空对象**,**没有方法和属性,是一个特殊的常量**
- 可以将 `None` 赋值给任何一个变量
**`fire` 方法需求**
- 1> 判断是否有枪,没有枪没法冲锋
- 2> 喊一声口号
- 3> 装填子弹
- 4> 射击
```python
class Soldier:
def __init__(self, name):
# 姓名
self.name = name
# 枪,士兵初始没有枪 None 关键字表示什么都没有
self.gun = None
def fire(self):
# 1. 判断士兵是否有枪
if self.gun is None:
print("[%s] 还没有枪..." % self.name)
return
# 2. 高喊口号
print("冲啊...[%s]" % self.name)
# 3. 让枪装填子弹
self.gun.add_bullet(50)
# 4. 让枪发射子弹
self.gun.shoot()
```
**小结**
1. 创建了一个 **士兵类**,使用到 `__init__` 内置方法
2. 在定义属性时,如果 **不知道设置什么初始值**,可以设置为 `None`
3. 在 **封装的** 方法内部,还可以让 **自己的** **使用其他类创建的对象属性** 调用已经 **封装好的方法**
## 02. 身份运算符
身份运算符用于 **比较** 两个对象的 **内存地址** 是否一致 —— **是否是对同一个对象的引用**
- 在 `Python` 中针对 `None` 比较时,建议使用 `is` 判断
| 运算符 | 描述 | 实例 |
| :----- | :---------------------------------------- | :------------------------------ |
| is | is 是判断两个标识符是不是引用同一个对象 | x is y,类似 id(x) == id(y) |
| is not | is not 是判断两个标识符是不是引用不同对象 | x is not y,类似 id(a) != id(b) |
### is 与 == 区别:
`is` 用于判断 **两个变量 引用对象是否为同一个**
`==` 用于判断 **引用变量的值** 是否相等
```python
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> b is a
False
>>> b == a
True
```
- linux基础
- 01_Python基础课程安排
- 02_操作系统(科普章节)
- 03_操作系统的发展史(科普章节)
- 04_文件和目录(理解)
- 05_Ubuntu图形界面入门
- 06_常用Linux命令的基本使用
- 07_Linux终端命令格式
- 08_文件和目录常用命令
- 09_远程管理常用命令
- 10_用户权限相关命令
- 11_系统信息相关命令
- 12_其他命令
- python基础
- 01_认识 Python
- 02_第一个Python 程序
- 03_PyCharm的初始设置(知道)
- 04_多文件项目的演练
- 05_注释
- 06_算数运算符
- 07_程序执行原理(科普)
- 08_变量的基本使用
- 09_变量的命名
- 10_判断(if)语句
- 11_运算符
- 12_循环
- 13_函数基础
- 14_高级变量类型
- 15_综合应用——名片管理系统
- 16_变量进阶(理解)
- 17_函数进阶.md
- 面向对象
- 01_面向对象(OOP)基本概念
- 02_类和对象
- 03_面向对象基础语法
- 04_面向对象封装案例
- 05_面向对象封装案例 II