码迷,mamicode.com
首页 > 其他好文 > 详细

初识面向对象

时间:2018-07-23 18:02:37      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:交互   alt   一个   生成   分享图片   wan   hide   walk   决定   

你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人, 一个是狗,且人和狗都有不同的技能,比如人拿棍打狗, 狗可以咬人,怎么描述这种不同的角色和他们的功能呢?
 
你搜罗了自己掌握的所有技能,写出了下面的代码来描述这两个角色
技术分享图片
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
人和狗的角色定制1

上面两个方法相当于造了两个模子,游戏里的每个人和每条狗都拥有相同里的属性。游戏开始,你根据一个人或一只狗传入的具体信息来塑造一个具体的人或者狗,怎么生成呢?

技术分享图片
d1 = dog("李磊","京巴")
p1 = person("严帅",36,"F","运维")
p2 = person("egon",27,"F","Teacher"
生成具体的人和狗

两个角色对象生成了,狗和人还有不同的功能呀,狗会咬人,人会打狗,对不对? 怎么实现呢,。。想到了, 可以每个功能再写一个函数,想执行哪个功能,直接 调用 就可以了,对不?

技术分享图片
def bark(d):
    print("dog %s:wang.wang..wang..."%d[name])
 
 
def walk(p):
    print("person %s is walking..." %p[name])<br><br>
bark和walk
技术分享图片
walk(p1) 
bark(d1)
调用walk和bark

上面的功能实现的简直是完美!

但是仔细玩耍一会,你就不小心干了下面这件事

技术分享图片
p1 = person("严帅",36,"F","运维")
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,
        walk:walk
    }
 
    return data
 
def dog(name,dog_type):
 
 
    def bark(d):
        print("dog %s:wang.wang..wang..."%d[name])
    data = {
        name:name,
        type:dog_type,
        bark:bark
    }
 
    return data
限制功能全新代码
技术分享图片
d1 = dog("李磊","京巴")
p1 = person("严帅",36,"F","运维")
p2 = person("egon",27,"F","Teacher")
生成具体的人和狗
技术分享图片
d1[bark](p1) #把人传给了狗的方法
无法调用了

你是如此的机智,这样就实现了限制人只能用人自己的功能啦。

刚刚你用的这种编程思想其实就是简单的面向对象编程,我们创造了两个模子表示游戏里所有的人和狗之后,剩下的狗叫或者人走对于这两个模子来说就不重要了。具体人he狗之间的交互就等着你去使用了。假如你和狗打起来了,这时候你是走路还是拿棍子打狗就由你自己决定了。那你的每一个决定可能都影响着你这场游戏的输赢。这也是不确定的。和我们之前写代码按部就班的走,最终都会实现我们要完成的事情不太一样了。

尽管如此,我们也只完成了这个游戏非常小的一部分。还有很多功能都没有实现。

刚才你只是阻止了两个完全 不同的角色 之前的功能混用, 但有没有可能 ,同一个种角色,但有些属性是不同的呢? 比如 ,大家都打过cs吧,cs里有警察和恐怖份子,但因为都 是人, 所以你写一个角色叫 person(), 警察和恐怖份子都 可以 互相射击,但警察不可以杀人质,恐怖分子可以,这怎么实现呢? 你想了说想,说,简单,只需要在杀人质的功能里加个判断,如果是警察,就不让杀不就ok了么。 没错, 这虽然 解决了杀人质的问题,但其实你会发现,警察和恐怖分子的区别还有很多,同时又有很多共性,如果 在每个区别处都 单独做判断,那得累死。 

初识面向对象

标签:交互   alt   一个   生成   分享图片   wan   hide   walk   决定   

原文地址:https://www.cnblogs.com/aaronthon/p/9355862.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!