# 面向對象封裝案例 II
## 目標
- 士兵突擊案例
- 身份運算符
**封裝**
1. **封裝** 是面向對象編程的一大特點
2. 面向對象編程的 **第一步** —— 將 **屬性** 和 **方法** **封裝** 到一個抽象的 **類** 中
3. **外界** 使用 **類** 創建 **對象**,然后 **讓對象調用方法**
4. **對象方法的細節** 都被 **封裝** 在 **類的內部**
> 一個對象的 **屬性** 可以是 **另外一個類創建的對象**
## 01. 士兵突擊
**需求**
1. **士兵** **許三多** 有一把 **AK47**
2. **士兵** 可以 **開火**
3. **槍** 能夠 **發射** 子彈
4. **槍** 裝填 **裝填子彈** —— **增加子彈數量**

### 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