python面向物件封裝案例之士兵突擊

面向物件封裝案例之士兵突擊

目標

士兵突擊案例

身份運算子

封裝

1。 封裝 是面向物件程式設計的一大特點

2。 面向物件程式設計的 第一步 —— 將 屬性 和 方法 封裝 到一個抽象的 類 中

3。 外界 使用 類 建立 物件,然後 讓物件呼叫方法

4。 物件方法的細節 都被 封裝 在 類的內部

> 一個物件的 屬性 可以是 另外一個類建立的物件

01。 士兵突擊

需求

1。 士兵 許三多 有一把 AK47

2。 士兵 可以 開火

3。 槍 能夠 發射 子彈

4。 槍 裝填 裝填子彈 —— 增加子彈數量

python面向物件封裝案例之士兵突擊

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

python面向物件封裝案例之士兵突擊