少儿编程很好学之从0开始学python-8.3面向对象实战
![](http://i.imgur.com/kln3Udp.jpg)
面向对象是目前主流的编程方法。通过面向对象,可以将系统有效的隔离,使得程序容易维护和扩展。在这节课里,我们会先开发一个简易的待办清单来退回面向对象的好处。
## 代办清单
![](http://pic.51yuansu.com/pic3/cover/01/18/92/59051e2a25484_610.jpg)
我们在学习生活中经常要安排处理很多事情。这些事情如果没有被整理后,很容易忘掉。终端版的待办事项就是为了解决这个问题实现。
我们首先定义个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对象的不同方法。
![](http://www.bkjia.com/uploads/allimg/140607/0129451435-0.jpg)
在这个项目里,我们复习了第六章学习的文件系统,将待办清单存储到磁盘,这样数据就不会丢失了。在大型系统里,我们会把数据保存到更专业的**数据库**中。
在 `Todo` 类中,`__saveTodo__` 和 `__loadTask__` 两个方法我们定义成了私有方法,通过这种方式。我们把数据的底层存储和上层使用隔离开,这样使用`Todo`类的人就不会关注这些内部细节了。
## 面向对象在游戏里的应用
面向对象在游戏里的使用就更普遍了,我们来用python模拟一下王者荣耀的亚瑟和安其拉。
![](http://newsimg.5054399.com/uploads/userup/1711/191F104G05.jpg)
~~~
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射击游戏(五)