Python 面向对象思想的导入

举报
Yuchuan 发表于 2020/02/04 22:58:27 2020/02/04
【摘要】 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。

你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<美女与野兽>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人, 一个是狗,且人和狗都有不同的技能,比如人拿棍打狗, 狗可以咬人,怎么描述这种不同的角色和他们的功能呢?

你搜罗了自己掌握的所有技能,写出了下面的代码来描述这两个角色

美女和野兽的角色定制:
def person(name, age, sex, job):
    data = {
        'name': name,
        'age': age,
        'sex': sex,
        'job': job
    }
    return data

def theBeast(name, dog_type):
    data = {
        'name': name,
        'type': dog_type
    }
    return data

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

生成具体的美女和野兽:

d1 = theBeast("野兽", "狼")
p1 = person("高富帅", 36, "F", "IT男")
p2 = person("白富美", 27, "F", "Teacher")
print(d1)
print(p1)
print(p2)

结果:

D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/ObjectDemo.py
{'name': '野兽', 'type': '狼'}
{'name': '高富帅', 'age': 36, 'sex': 'F', 'job': 'IT男'}
{'name': '白富美', 'age': 27, 'sex': 'F', 'job': 'Teacher'}

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

def bark(d):
    print("theBeast %s:hehe.hehe..hehe..." % d['name'])

def walk(p):
    print("beauty %s is walking..." % p['name'])

walk(p1)
bark(d1)

结果:

D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/ObjectDemo.py
beauty 高富帅 is walking...
theBeast 野兽:hehe.hehe..hehe...

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

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

p1 = person("白富美", 27, "F", "Teacher")
bark(p1)  # 把人的对象传给了狗的方法

结果:

D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/ObjectDemo.py
theBeast 白富美:hehe.hehe..hehe...

事实 上,从你写的代码上来看,这并没出错。很显然,美女是不能调用野兽的功能的,但在你的程序例没有做限制,如何在代码级别实现这个限制呢?

限制功能全新代码:

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 theBeast(name, dog_type):
    def bark(d):
        print("theBeast %s:hehe.hehe..hehe..." % d['name'])
    data = {
        'name': name,
        'type': dog_type,
        'bark': bark
    }
    return data

生成具体的美女和野兽:

d1 = theBeast("野兽", "狼")
p1 = person("高富帅", 36, "F", "IT男")
p2 = person("白富美", 27, "F", "Teacher")

结果:

D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/ObjectDemo.py
{'name': '野兽', 'type': '狼', 'bark': <function theBeast.<locals>.bark at 0x000001D270775840>}
{'name': '高富帅', 'age': 36, 'sex': 'F', 'job': 'IT男', 'walk': <function person.<locals>.walk at 0x000001D2707756A8>}
{'name': '白富美', 'age': 27, 'sex': 'F', 'job': 'Teacher', 'walk': <function person.<locals>.walk at 0x000001D270775BF8>}

无法调用了:

d1['bark'](p1)  # 把人传给了狗的方法

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

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

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

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

你想了想说, 那就直接写2个角色吧, 反正 这么多区别, 不能写两个角色呀,因为他们还有很多共性 , 写两个不同的角色,就代表 相同的功能 也要重写了,是不是? 。。。

好了, 话题就给你点到这, 再多说你的智商也理解不了了!


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。