# 楔子
'''
你现在是一家游戏公司的开发人员,现在需要你开发一款叫做人狗大战的游戏,
你就思考人狗大战,至少需要两个角色,一个是人,一个是狗,且人和狗都有不同的技能,
比如人拿棍打狗,狗可以咬人,怎么秒描述这种不同的角色和他的功能呢?
'''
#你搜罗了自己掌握的技能,写出了下面的代码来描述这两个角色、
# 人和狗的角色定制
def person(name,age,sex,job):
data = {
'name':name,
'age':age,
'sex':sex,
'job':job
}
return data
def dog(name,dog_type):
data = {
'name':name,
'type':dog_type,
}
return data
# print(person('小金',10,'男','运动员'))
# print(dog('大黄','金毛'))
'''
上面两种方法相当于造了两个模子,游戏里面的每个人都拥有相同的属性,游戏开始,
你根据一个人或者是一只狗传入的具体信息来塑造一个具体的人或者狗,怎么生成呢??
'''
# 生成具体的人和狗
p1 = person('小金',10,'男','运动员')
d1 = dog('大黄','金毛')
'''
# 两个角色对象生成了,狗和人还有不同的功能呀,狗会咬人,人会打狗,怎么实现,
# 每个功能再写一个函数相对应,想执行哪个功能,调用哪个函数就行
'''
# 写两个功能函数
def bark(d):
print('dog %s:wang.wang.wang...' %d['name'])
def walk(p):
print('perdon %s is walking...'%p['name'])
# 调用两个函数
walk(p1)
bark(d1)
# 如果把人的对象传给了狗的方法
p1 = person('小金',10,'男','运动员')
bark(p1) #把人的对象传给了狗的方法
'''
#事实上,我们写的代码没有错,但是人显然是不能调用狗的功能的,
# 但在你的程序中并没有做限制,如何在代码级别实现这个限制呢?
'''
# 限制功能全新代码
def person(name,age,sex,job):
def walk(p):
print('person %s is walking...' %p['name'])
data = {
'name': name,
'age': age,
'sex': sex,
'job': job
}
return data
def dog(name, dog_type):
def bark(d):
print('dog %s is wang.wang.wang....' %d['name'])
data = {
'name': name,
'type': dog_type,
}
return data
# 生成 具体的人和狗
d1 = dog("豆豆","京巴")
p2 = person("小明",27,"男","Teacher")
# 无法调用
d1['bark'](p1) #把人传给了狗的方法
'''
刚刚我们用的这种编程思想就是简单的面向对象编程,我们创造了两个模子表示游戏里所有的人和狗之后,
剩下的狗叫或者人走对于这两个模子来说就不重要了,具体人格狗之间的交互就等着你去使用了,
假如你和狗打起来了,这个时候你是走路还是拿棍子打狗都由你自己决定,
你每一个决定可能都影响着你这场比赛的输赢。
尽管如此,我们也只是完成了这个游戏非常小的一部分,还有很多功能都没有实现。
刚刚你只是阻止了两个完全不同的角色之间的功能混用,有没有可能,同一个角色但有些属性是不同的呢?
比如CS里面有警察和恐怖分子,但因为都是人,所以你可以写一个角色叫person()
警察和恐怖分子都可以相互设计,但是警察不可以杀人之,恐怖分子可以,这怎么实现呢?
你想了想说,简单,只要杀人质的功能里加一个判断,如果是警察不让杀就行了,没错,这个可以,
但是你会发现,警察和恐怖分子之间的区别还有很多,同时又有很多共性,
如果在每个区别都单独做判断,那么的累死。
'''
# 面向对象VS面向过程
'''
面向对象的程序设计的核心是过程(流水线式思维),过程及解决问题的步骤,
面向过程就好比精心设计好一条流水线,考虑周全什么时候处理什么东西.
优点是:
极大地降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可
缺点是:
一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
应用场景:一旦完成基本很少改变的场景,著名立足有Linux内核,git,以及Apache HTTP Server
面向对象的程序设计核心是对象(上帝式思维),要理解对象为何物,必须把自己当成一个上帝
上帝眼中时间存在的万物皆对象,不存在的也可以创造出来,面向对象的程序设计好比如来设计西游记,
如来要解决的问题是把经书传给东土大唐,如来想解决这个问题需要四个人:,每个人都有各自的特征和技能
(这就是对象的概念,特征和技能分别对应对象的属性和方法),然而这并不好玩,于是如来
安排了一群妖魔鬼怪,为了防止师徒四人在取经路上被搞死,有安排了一群神仙保驾护航,这些都是对象。然后曲靖开始,
师徒四人与妖魔鬼怪神仙互相缠斗,最终取得真经,如来根本就不会管师徒四人按照什么流程去取。
面向对象的程序设计的
优点是:
解决了程序的扩展性。对某一个对象单独修改,会立即反应到整个体系中
入队游戏中的一个人物参数的特征和技能的修改都很容易。
缺点是:
可控制性差,取法想面向对象的程序设计流水线式的可以很精准的预测问题的处理流程与结果,
面向对象的程序一旦开始就有对象之间的交互解决问题,即便是上帝也无法预测最终结果,
于是我们经常看到一个游戏人某一参数修改极可能导致阴霸的技能出现,一刀砍死三个人,这个游戏就是去平衡。
应用场景:
需求经常变化的软件,一般需求的变化集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。
在Python中 面向对象的程序设计并不是全部。
面向对象编程可以是程序的维护和拓展变得更加简单,并且可以大大提高程序开发效率,另外,基于面向对象的程序可以使他更容易理解你的代码逻辑
从而使团队变得更加从容。
了解一些名词:类,对象,实例,实例化
类:具有相同特征的一类事物(人,狗,老虎)
对象/实例:具体的某一事物(隔壁阿花,楼下旺财)
实例化:类---对象的过程(这在生活中表现的并不明显,我们在后面慢慢解释
'''