面向物件封裝案例之士兵突擊
目標
士兵突擊案例
身份運算子
封裝
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> 射擊
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)
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 是判斷兩個識別符號是不是引用同一個物件
x is y,類似 id(x) == id(y)
is not 是判斷兩個識別符號是不是引用不同物件
x is not y,類似 id(a) != id(b)
is 與 == 區別:
`is` 用於判斷 兩個變數 引用物件是否為同一個
`==` 用於判斷 引用變數的值 是否相等
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> b is a
False
>>> b == a
True