大家好,又见面了,我是你们的朋友全栈君。
一个简单的小例子,定义一个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了~
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/156144.html原文链接:https://javaforall.cn