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