py---------面向对象基础篇

一、引子

你现在是一家游戏公司的开发人员,现在你需要开发一款叫做《人猫大战》的小游戏,你就思考呀,人猫大战,那至少需要两个角色,一个是人,一个是猫,且人和猫有不同的技能,比如人拿棍打狗,狗可以咬人,让我们来描述这种不同角色和他们的功能?

首先定义初始技能,描述两个角色

#人和狗初始角色1
def Person(name,sex,hp,dps):   # 人模子
    dic = {'name':name,'sex':sex,'hp':hp,'dps':dps,'bag':[]}
    return dic
def Dog(name,kind,hp,dps):   # 狗模子
    dic = {'name':name,'kind':kind,'hp':hp,'dps':dps}
    return dic
人和狗初始角色1

定义了两个模子,游戏里的每个人和每只猫拥有相同属性。具体传入一个人和一只猫。

#生一个人和一条狗具体参数
alex = Person('alex','不详',250,5)     #一个人alex
ha2 = Dog('小黑','藏獒',15000,200)   #一只猫 小花
生成人和猫具体信

 两个角色对象生成了,狗和人的功能不同,打狗,狗咬人,这时候每一个功能写一个函数,用哪个功能那个就调用哪个。

#######人打狗
def attack(person,dog):
    dog['hp'] -= person['dps']
    print('%s打了%s,%s掉了%s点血,剩余%s点血'%(person['name'],dog['name'],dog['name'],person['dps'],dog['hp']))

attack(alex,ha2)
print(ha2)     #原来血量减少了

####狗咬人
def bite(dog,person):
    person['hp'] -= dog['dps']
    print('%s咬了%s,%s掉了%s点血,剩余%s点血'%(dog['name'],person['name'],person['name'],dog['dps'],person['hp']))

bite(ha2,alex)  #结果: 小黑咬了alex,alex掉了200点血,剩余50点血
print(alex)      #结果: {'name': 'alex', 'sex': '不详', 'hp': 50, 'dps': 5, 'bag': []}
attact 和 bite

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

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

bite(alex,ha2)   #让alex咬了小黑,哈哈哈

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

def Person(name,sex,hp,dps):   # 人模子
    dic = {'name':name,'sex':sex,'hp':hp,'dps':dps,'bag':[]}
    def attack(dog):
        dog['hp'] -= dic['dps']
        print('%s打了%s,%s掉了%s点血,剩余%s点血' % (dic['name'], dog['name'], dog['name'], dic['dps'], dog['hp']))
    dic['attack'] = attack
    return dic

def Dog(name,kind,hp,dps):   # 狗模子
    dic = {'name':name,'kind':kind,'hp':hp,'dps':dps}
    def bite(person):
        person['hp'] -= dic['dps']
        print('%s咬了%s,%s掉了%s点血,剩余%s点血' % (dic['name'], person['name'], person['name'], dic['dps'], person['hp']))
    dic['bite'] = bite
    return dic
alex = Person('alex','不详',250,5)
ha2 = Dog('哈士奇','藏獒',15000,200)

# 人打狗
print(ha2)   #打狗钱'hp': 15000
print(alex['attack'])   #属于Person.<locals>局部组的函数
alex['attack'](ha2)  #alex 打狗

print(ha2)   #打狗后'hp': 14995

#alex['bite'](ha2)    #alex 咬狗这会就报错啦
限制alex咬狗的全新代码

猜你喜欢

转载自www.cnblogs.com/edeny/p/9035473.html