python面向对象前戏
面向对象编程思想前戏
如果此时你想开发一个小游戏,名为猫狗大战,显然,开发这个游戏需要创建猫和狗的角色。
方式一:使用字典的方法
# 狗
dog = {
'name': '大黄',
'type': '田园犬',
'attack_val': 30,
'life_val': 500
}
# 猫
cat = {
'name': '汤姆',
'type': '英短蓝猫',
'attack_val': 50,
'life_val': 300
}
方式二:使用函数的方法
# 获取狗的角色
def get_dog(name, t_type, attack_val, life_val):
data_dict = {
'name': name,
't_type': t_type,
'attack_val': attack_val,
'life_val': life_val
}
return data_dict
# 获取猫的角色
def get_cat(name, t_type, attack_val, life_val):
data_dict = {
'name': name,
't_type': t_type,
'attack_val': attack_val,
'life_val': life_val
}
return data_dict
dog = get_dog('大黄', '田园犬', 30, 500)
cat = get_cat('汤姆', '英短蓝猫', 50, 300)
创建完角色后就可以去实现攻击的功能了,使用最简答的掉血逻辑:血量减去对方攻击力
# 狗发动攻击
def dog_attack(dog_obj, cat_obj):
cat_obj['life_val'] -= dog_obj.get('attack_val')
print("""狗:%s 攻击了猫:%s 猫的剩余血量:%s""" % (dog_obj.get('name'), cat_obj.get('name'), cat_obj.get('life_val')))
# 猫发动攻击
def cat_attack(cat_obj, dog_obj):
dog_obj['life_val'] -= cat_obj.get('attack_val')
print("""猫:%s 攻击了狗:%s 狗的剩余血量:%s""" % (cat_obj.get('name'), dog_obj.get('name'), dog_obj.get('attack_val')))
测试
# 狗发动攻击
dog_attack(dog, cat)
# 猫发动攻击
cat_attack(cat, dog)
"""
运行结果:
狗:大黄 攻击了猫:汤姆 猫的剩余血量:270
猫:汤姆 攻击了狗:大黄 狗的剩余血量:450
"""
可以看出这时是没有问题的,但如果狗去调用猫的攻击呢?
# 狗去调用猫的攻击呢
cat_attack(dog, cat)
"""
运行结果:
猫:大黄 攻击了狗:汤姆 狗的剩余血量:270
"""
很明显,这时程序出问题了,如果不同角色调用别的角色的攻击方法,就会出现问题,那么该如何让角色只能调用自己的攻击方法呢?
def get_dog(name, t_type, attack_val, life_val):
# 将狗发动攻击的函数放在产生狗的函数内
def dog_attack(dog_obj, cat_obj):
cat_obj['life_val'] -= dog_obj.get('attack_val')
print("""狗:%s 攻击了猫:%s 猫的剩余血量:%s""" % (dog_obj.get('name'), cat_obj.get('name'), cat_obj.get('life_val')))
# 狗
dog = {
'name': name,
'type': t_type,
'attack_val': attack_val,
'life_val': life_val,
'dog_attack': dog_attack # 把攻击方式写进去
}
return dog
def get_cat(name, t_type, attack_val, life_val):
# 将猫发动攻击的函数放在产生猫的函数内
def cat_attack(cat_obj, dog_obj):
dog_obj['life_val'] -= cat_obj.get('attack_val')
print("""猫:%s 攻击了狗:%s 狗的剩余血量:%s""" % (cat_obj.get('name'), dog_obj.get('name'), dog_obj.get('attack_val')))
# 猫
cat = {
'name': name,
'type': t_type,
'attack_val': attack_val,
'life_val': life_val,
'cat_attack': cat_attack # 把攻击方式写进去
}
return cat
dog = get_dog('大黄', '田园犬', 30, 500)
cat = get_cat('汤姆', '英短蓝猫', 50, 300)
dog['dog_attack'](dog, cat)
cat['cat_attack'](cat, dog)
只要把攻击方式写在创建角色的函数里面,别的角色就无法调用其他角色的攻击方式了。
上述将数据与功能整合到一起的操作其实就是面向对象编程的思想。
编程思想
编程思想有面向过程编程和面向对象编程。
1.面向过程编程
面向过程编程就是将程序的执行流程化,即分步操作,在分步的过程中解决问题。过程可以理解成是流水线,面向过程编程可以理解成是在创建一条流水线。
举例:登录功能,第一步获取用户名和密码,第二步比对用户名和密码
2.面向对象编程
面向对象编程核心就是"对象"二字。对象其实就是一个"容器" 将数据与功能整合到一起,只要是符合上述描述的事物都可以称之为是对象!
举例:猫狗大战最后的函数内部含有数据和功能,可以称之为面向对象编程。