美文网首页
小猿圈python学习-面向对象来了

小猿圈python学习-面向对象来了

作者: 小猿圈IT教育 | 来源:发表于2019-07-11 10:25 被阅读0次

    引子

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

    列下具体需求:

    1.人狗大战,生成多条狗,多个人

    2.狗能咬人,人能打狗

    3.咬了或被打了都掉血

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

    dog_attack_level = {

        "京巴":20,

        "藏獒":80,

        "平头哥":60

    }

    def dog(name,d_type):

        if d_type in dog_attack_level:

            d = {

                "name":name,

                "type":d_type,

                "life_val" :100

            }

        else:

            print("未知物种,不易接近")

            return None

        return d

    def person(name,age,sex):

        d = {

            "name": name,

            "age": age,

            "sex":sex,

            "life_val": 100

        }

        if age > 18:

            d["attack_level"] = 50

        else:

            d["attack_level"] = 30

        return d

    上面两个方法相当于造了两个模子,游戏开始,你得生成一个人和狗的实际对象吧,怎么生成呢?

    dog1 = dog("majj","平头哥")

    dog2 = dog("二哈","京巴")

    p1 = person("alex",22,"male")

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

    def bite(dog_obj,person_obj):

        person_obj["life_val"] -= dog_attack_level[dog_obj["type"]]

        print("疯狗[%s]咬了[%s],掉血[%s]..." %(dog_obj["name"], person_obj['name'], dog_attack_level[dog_obj["type"]]) )

    def beat(person_obj,dog_obj):

        dog_obj["life_val"] -= person_obj['attack_level']

        print("[%s] 打了 疯狗[%s],狗掉血[%s]..." %(person_obj["name"], dog_obj["name"], person_obj["attack_level"]))

    dog1 = dog("majj","平头哥")

    dog2 = dog("二哈","京巴")

    p1 = person("alex",22,"male")

    bite(dog1,p1) #调用

    beat(p1,dog2)

    print(dog1,dog2)

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

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

    人是不应该调用狗的功能的,如何在代码级别实现这个限制呢?

    dog_attack_level = {

        "京巴":20,

        "藏獒":80,

        "平头哥":60

    }

    def dog(name,d_type):

        if d_type in dog_attack_level:

            d = {

                "name":name,

                "type":d_type,

                "life_val" :100

            }

        else:

            print("未知物种,不易接近")

            return None

        def bite(person_obj): # 把这个方法写在dog里面,表示这是dog独有的功能

            person_obj["life_val"] -= dog_attack_level[d["type"]]

            print("疯狗[%s]咬了[%s],掉血[%s]..." % (d["name"], person_obj['name'], dog_attack_level[d["type"]]))

        d["bite"] = bite

        return d

    def person(name,age,sex):

        d = {

            "name": name,

            "age": age,

            "sex":sex,

            "life_val": 100

        }

        if age > 18:

            d["attack_level"] = 50

        else:

            d["attack_level"] = 30

        def beat( dog_obj): # 把这个方法写在person里面,表示这是person独有的功能

            dog_obj["life_val"] -= d['attack_level']

            print("[%s] 打了 疯狗[%s],狗掉血[%s]..." % (d["name"], dog_obj["name"], d["attack_level"]))

        d["beat"] = beat

        return d

    dog1 = dog("majj","平头哥")

    dog2 = dog("二哈","京巴")

    p1 = person("alex",22,"male")

    dog1["bite"](p1)  # 调用时只传递要咬谁就行了

    p1["beat"](dog2)

    print(dog1,dog2)

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

    说了这么多,这跟面向对象有什么关系么? 当然有,其实你上面写的代码,就是面向对象的代码。

    你在设计角色时,为了让一个角色可以变成多个实体对象,你设计了一个基础模板,只要传入不同参数,就会产生不同的狗。 这代表你已经开始切换成上帝视角看事情 ,上帝视角就是面向对象编程的视角,上帝要造世界万物,他肯定不是一个一个的造出来,他肯定是设计出一个个的物种的模板,然后通过模子批量批一个个的实体造出来。造出来的实体各有特色,属性、功能都不尽相同,有的人的贪婪、有的人好色、有的人懦弱,有的人勇猛。这些人之间会发生什么关系 ,谁和谁交媾、谁和谁打仗,上帝懒的管,上帝只控制大局。听着玄乎吧,我们接下来一点点接晓怎么通过面向对象在编程世界里做上帝。

    相关文章

      网友评论

          本文标题:小猿圈python学习-面向对象来了

          本文链接:https://www.haomeiwen.com/subject/snhrkctx.html