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.面向对象编程

面向对象编程核心就是"对象"二字。对象其实就是一个"容器" 将数据与功能整合到一起,只要是符合上述描述的事物都可以称之为是对象!

举例:猫狗大战最后的函数内部含有数据和功能,可以称之为面向对象编程。