• python学习笔记 day22 面向对象(一)


     1. 人狗大战

    一个简单的小例子,定义一个Person(类)里面有人的很多属性,比如名字,性别,血量。攻击力,然后定义一个Dog(类),里面设置狗的很多属性,名字,血量,攻击力,种类等,然后又定义了两个函数attack 人打狗,以及bite()狗打人的函数,然后就可以操作这些函数,让人狗大战啦:

    def Person(name,aggr,blood,sex):
        person={
            'name':name,
            'aggr':aggr,
            'blood':blood,
            'sex':sex
        }
        return person
    
    def attack(person,dog):
        dog['blood']-=person['aggr']
        print("%s 被打了,掉了%s 的血"%(dog['name'],person['aggr']))
    
    def Dog(name,aggr,blood,kind):
        dog={
            'name':name,
            'aggr':aggr,
            'blood':blood,
            'kind':kind
        }
        return dog
    
    def bite(dog,person):
        person['blood']-=dog['aggr']
        print("%s 被咬了,掉了%s 的血"%(person['name'],dog['aggr']))
    xuanxuan=Person('alex',2,100,'')
    lucky=Dog('lucky',2,200,'泰迪')
    
    attack(xuanxuan,lucky)
    bite(lucky,xuanxuan)

    运行结果:

    但是有一点问题就是attack()也可以传参数,让狗“打”人(虽然我们知道这样是不合理的,所以才是有问题):

    比如 bite(xuanxuan,lucky)的意义就变成了,xuanxuan咬lucky 这显然是不合理的~

    所以可以考虑把bite()这个跟狗有关的 放在Dog()函数里面,限制只能由lucky这个已经实例化Dog()类的狗来调用,接下来给bite()函数传一个对象就可以啦~

    def Person(name,aggr,blood,sex):
        person={
            'name':name,
            'aggr':aggr,
            'blood':blood,
            'sex':sex
        }
        def attack(dog):  # 这就形成了一个闭包,就是在内部函数中使用了外部函数内的变量名
            dog['blood'] -= person['aggr']
            print("%s 被打了,掉了%s 的血" % (dog['name'], person['aggr']))
        person['attack']=attack
        return person
    
    
    
    def Dog(name,aggr,blood,kind):
        dog={
            'name':name,
            'aggr':aggr,
            'blood':blood,
            'kind':kind
        }
        def bite(person):
            person['blood'] -= dog['aggr']
            print("%s 被咬了,掉了%s 的血" % (person['name'], dog['aggr']))
        dog['bite']=bite
        return dog
    
    
    xuanxuan=Person('alex',2,100,'')
    lucky=Dog('lucky',2,200,'泰迪')
    
    xuanxuan['atack'](lucky)  # 首先xuanxuan是一个字典 然后里面有个key 是attack 对应的value值是attack()函数,限制在函数Person()函数内部,就可以不乱颠倒人狗打架操作
    lucky['bite'](xuanxuan)   # lucky是一个上面定义的字典,然后有个key 是bite。对应的是函数bite()函数,外不知可以传一个person 限制狗咬人

    运行结果:

    lucky是调用的Dog()传进了一些参数,定义它为一条狗,然后由于Dog()函数在内部定义了一个函数(闭包)bite()函数(有个参数)让外部不能直接调用bite函数,只能通过县定义一个狗,然后通过这个狗['bite']来调用bite()函数,这样我们bite()函数中穿的就是一个人,或另外一条狗,都是很合理的,就不会出现原来的bite()传两个参数,bite(xuanxuan,lucky)变成xuanxuan咬lucky了~

    talk is cheap,show me the code
  • 相关阅读:
    浙江大学数据结构:02-线性结构3 Reversing Linked List (25分)
    浙江大学数据结构:02-线性结构2 一元多项式的乘法与加法运算 (20分)
    浙江大学数据结构:01-复杂度2 Maximum Subsequence Sum (25分)
    SQL事务--转载
    触发器--转载
    项目版本控制工具SVN介绍--转载
    项目版本控制工具VSS介绍--转载
    AE开发中ICircularArc接口的图形要素保存与形状简化--原创
    ArcGISEngine绘制椭圆--转载
    NPOI学习--转载
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9657767.html
Copyright © 2020-2023  润新知