少兒編程很好學之從0開始學python-8.3面向對象實戰

面向對象是目前主流的編程方法。通過面向對象,可以將系統有效的隔離,使得程序容易維護和擴展。在這節課里,我們會先開發一個簡易的待辦清單來退回面向對象的好處。
## 代辦清單

我們在學習生活中經常要安排處理很多事情。這些事情如果沒有被整理后,很容易忘掉。終端版的待辦事項就是為了解決這個問題實現。
我們首先定義個Task類:
~~~
class Todo:
def __init__(self):
self.taskList = []
self.__fileLocation__ = "./todo.txt"
self.__loadTask__()
def addTodo(self, thing):
self.taskList.append(thing)
self.__saveTodo__()
return True
def removeTodo(self, thing):
if not thing in self.taskList:
return False
else:
self.taskList.remove(thing)
self.__saveTodo__()
return True
def searchTodo(self, thing):
for todo in self.taskList:
if thing in todo:
return todo
return None
def getAllToto(self):
return self.taskList
def __loadTask__(self):
file = open(self.__fileLocation__, 'r')
self.taskList = file.readlines()
def __saveTodo__(self):
file = open(self.__fileLocation__, 'w')
file.write('\n'.join(self.taskList))
file.close()
~~~
這個類定義了一個taskList實例屬性,擁有:`getAllToto searchTodo removeTodo addTodo` 幾個方法。同時,為了所有的備忘事項通過 `__saveTodo__` 方法存儲到磁盤里。
接著,我們來使用這個類:
~~~
todo = Todo()
while True:
command = input('command arg')
if 'exit' == command:
exit(0)
commandArr = command.split(' ')
if 'addTodo' == commandArr[0]:
todo.addTodo(commandArr[1])
elif 'removeTodo' == commandArr[0]:
todo.removeTodo(commandArr[1])
elif 'getAllToto' == commandArr[0]:
print(todo.getAllToto())
else:
print('not find command')
~~~
我們首先實例化了一個 Todo類。接著用`while` 循環不斷監聽用戶的輸入。程序根據用戶的輸入調用todo對象的不同方法。

在這個項目里,我們復習了第六章學習的文件系統,將待辦清單存儲到磁盤,這樣數據就不會丟失了。在大型系統里,我們會把數據保存到更專業的**數據庫**中。
在 `Todo` 類中,`__saveTodo__` 和 `__loadTask__` 兩個方法我們定義成了私有方法,通過這種方式。我們把數據的底層存儲和上層使用隔離開,這樣使用`Todo`類的人就不會關注這些內部細節了。
## 面向對象在游戲里的應用
面向對象在游戲里的使用就更普遍了,我們來用python模擬一下王者榮耀的亞瑟和安其拉。

~~~
class Hero:
def __init__(self, nickname, life_value, aggre_value):
self.nickname = nickname
self.life_value = life_value
self.aggre_value = aggre_value
def attack(self, enemy):
self.skill()
enemy.life_value = enemy.life_value - self.aggre_value
def skill(self):
print('skill')
class Arthur(Hero):
def skill(self):
print('圣劍裁決')
class Angela(Hero):
def skill(self):
print('熾熱關輝')
~~~
我們定義了一個hero類,這個類包含 life_value aggre_value 兩個屬性,分別表示生命值和攻擊值。attack方法根據自己的aggre_value屬性的值扣減敵人血量。
`Arthur`類和`Angela`類用來表達亞瑟和安其拉。這兩個類復寫了 `skill`方法。讓亞瑟和安其拉擁有不同的技能。
```
yanse = Arthur('yase',5000,100)
anjiya = Angela('anjila', 3500, 200)
anjiyaAttackCount= 0
yanseAttackCount = 0
while True:
anjiya.attack(yanse)
anjiyaAttackCount = anjiyaAttackCount+1
print(yanse.life\_value)
if yanse.life\_value<=0:
print('yase die')
print(anjiyaAttackCount,yanseAttackCount)
exit(0)
yanse.attack(anjiya)
yanseAttackCount = yanseAttackCount +1
print(anjiya.life\_value)
if anjiya.life\_value<=0:
print('anjila die')
print(anjiyaAttackCount,yanseAttackCount)
exit(0)
```
英雄的攻擊技能會首先調用skill方法展示自己的技能,然后執行公共的扣血動作。
通過面向對象,將系統的公共部分和具體實現部分做到了很好的隔離,小朋友們是不是也有這種感覺啦?
經過了這么久的終端編程,是不是很乏了?下節課,我們就進入圖形編程了。我們寫的代碼也終于可以有一張漂亮的*臉*了,加油!
**阿達老師-孩子身邊的編程專家**
*完整課程請關注阿達老師,主頁里有完整的課程目錄和觀看地址*
- 課程介紹
- 搭建環境
- 什么是計算機
- 程序是怎么運行的
- 安裝python
- 項目實例-安裝IDE
- 變量和簡單數據類型
- 數據&變量
- 數字
- 字符串
- 布爾類型
- 項目實例
- 容器-列表
- 容器
- 列表
- 項目實例
- 容器-字典
- 定義字典
- 項目實例
- 數據類型總結
- 條件語句
- python條件語句
- 項目實例
- 循環語句
- for循環
- while循環
- 項目實例
- 函數
- 5.0函數定義
- 5.2函數實戰
- 6.文件系統
- 6.1 文件系統介紹&python查找文件
- 6.2 用python讀寫文件
- 7. python操作時間
- 8.面向對象
- 8.1 類和對象
- 8.2 繼承和重寫
- 8.3 面向對象項目實戰
- 9 GUI編程
- 9.1 GUI基礎
- 9.2 備忘清單GUI版
- 10.網絡
- 10.1 網絡的發展
- 10.2 python http
- 11.web開發
- 11.1 web基礎&HTML
- 11.2 CSS&JavaScript
- 11.3 網頁計算器
- 11.3 網站開發實戰-播客搭建
- 11.3 python-web
- 12. 項目實戰-數據處理
- 13. 項目實戰-AI入門
- 13.1 環境搭建
- 心得
- 13.2 Tensorflow的瓜怎么吃
- 14 pygame
- 14.1 pygame Helloworld
- 14.4 pygame 動畫基礎 Animation
- 從0開始學python第14.5節 pygame 加載圖片和聲音
- 從0開始學python第14.6節 pygame.sprite(上)
- 14.7 pygame.sprite模塊(下)
- 14.8 pygame射擊游戲(一)
- pygame射擊游戲(二)
- 14.8 pygame射擊游戲(三)
- 14.8 pygame射擊游戲(四)
- 14.8 pygame射擊游戲(五)