面向对象与面向过程
面向过程:一开始是为了科学计算而出现的(就像算数学题一样,就是一步一步解题的过程)。编程的方法是自顶向下。代码的主体:程序=数据(变量)+算法(函数/过程)(这感觉就像在刷题的时候遇到的那些题)。通过函数/过程操纵表现世界的数据与状态。
面向对象:后来软件应用领域的扩张,是为了模拟现实世界的(现实世界就像人与人的交往一样)。编程方法是自底向上。代码的主体:程序=对象+交互(实际项目中才会有那么多的对象和交互吧)。把世界描绘成具有主动性的对象之间交互。
对象
对象可以指自然界中的任何事物;计算机为解决某个领域问题所使用的事物(自然界中的事物的模型化);事物(对象)具有自身的特征或能力;计算机中的对象具有解决问题所需的特征或能力。
对象的特征
封装:将模型的特征和能力打包在一起;模型的改变由模型自身来完成,就像自然界的事物一样;隐藏模型的细节,外界只能使用它,而不必/不能改变他。
继承:符合自然界的分类规律;快速的代码重用。
多态:子类可以继承父类的特征与能力,还可以自定义修改其特征与能力;鸭子类型(后面补充)。
组合:一个模型可以由其他模型组成
练习去:
一款简单自动运行小游戏模拟:在一维的地图上,有一只虫子和一只蚂蚁。
每一次他们都走过一个-3,-2,2,3个随机单位的距离(选定走法,若达
到地图边界则放弃移动)。当蚂蚁、虫子处于同一位置时,蚂蚁吃掉虫子,
程序结束。
面向过程:
import random
class Sprite:
step = [-2,+2,-3,+3]
def __init__(self,gm,point=None):
self.gm = gm
if point is None:
self.point = random.randint(0,20)
else:
self.point = point
def jump(self):
astep = random.choice(Sprite.step)
if 0 <= self.point + astep <= 20:
self.point += astep
class Ant(Sprite):
def __init__(self,gm,point=None):
super().__init__(gm,point)
self.gm.set_point('ant',self.point)
def jump(self):
super().jump()
self.gm.set_point('ant',self.point)
class Worm(Sprite):
def __init__(self,gm,point=None):
super().__init__(gm,point)
self.gm.set_point('worm',self.point)
def jump(self):
super().jump()
self.gm.set_point('worm',self.point)
class GameMap:
def __init__(self):
self.ant_point = None
self.worm_point = None
def catched(self):
print('ant:',self.ant_point,'worm:',self.worm_point)
if self.ant_point is not None and self.worm_point is not None and self.ant_point == self.worm_point:
return True
def set_point(self,src,point):
if src == 'ant':
self.ant_point = point
if src == 'worm':
self.worm_point = point
if __name__ == '__main__':
gm = GameMap()
worm = Worm(gm)
ant = Ant(gm)
while not gm.catched():
worm.jump()
ant.jump()
面向对象:
import random
ant_point = random.randint(0,20)
worm_point = random.randint(0,20)
print('ant_point:',ant_point,' worm_point:',worm_point)
step = [-2,+2,-3,+3]
while ant_point != worm_point:
astep = random.choice(step)
if 0 <= ant_point + astep <= 20:
ant_point += astep
astep = random.choice(step)
if 0 <= worm_point + astep <= 20:
worm_point += astep
print('ant_point:',ant_point,' worm_point:',worm_point)