面向对象开发入门例子

最近在学习Python,发现一个学习面向对象开发很好的例子,于是用js实现了一遍,下面是源码,有兴趣的同学可以看下:

// 老王开枪

/**
 * @desc 人类
 */
class Person {
    constructor(name) {
        this.name = name
        this.gun = null
        this.hp = 100
    }
    // 安装子弹
    anzhuangZidan(danjia, zidan) {
      danjia.saveZidan(zidan)
    }
    // 安装弹夹
    anzhuangDanjia(ak47, danjia) {
    ak47.saveDanjia(danjia)
  }
    // 拿枪
    naqiang(gun) {
    this.gun = gun
  }
    // 扣扳机
    koubanjia(laosong) {
      this.gun.fire(laosong)
    }
    // 掉血
    diaoxue(shashangli) {
      this.hp -= shashangli 
    }
    // 测试信息
  test() {
    return this.gun 
      ? `${this.name}的血量是${this.hp}, 有枪, ${this.gun.test()}`
      : this.hp 
        ? `${this.name}的血量是${this.hp}, 没有枪`
        : `${this.name}挂了....`
  }
}

/**
 * @desc 枪类
 */
class Gun {
  constructor(name) {
    this.name = name
    this.danjia = null
  }
  // 将弹夹安装到枪上
  saveDanjia(danjia) {
    this.danjia = danjia
  }
  // 开火
  fire(laosong) {
    var zidanObj = this.danjia.tanchuDanjia(laosong)
    if (!zidanObj) {
        return '没有子弹了'
    }
    zidanObj.jizhong(laosong)
  }
  // 测试信息
  test() {
    return `枪的信息是: ${this.name}, ${this.danjia.test()}`
  }
}

/**
 * @desc 弹夹类
 */
class Danjia {
  constructor(max_num) {
    this.max_num = max_num
    this.zidanList = []
  }
  // 将子弹安装到弹夹
  saveZidan(zidan) {
    this.zidanList.push(zidan)
  }
  // 弹出最上面的子弹
  tanchuDanjia(laosong) {
     return this.zidanList ? this.zidanList.pop() : null
  }
  // 测试信息
   test() {
    return this.zidanList.length 
      ? `弹夹的信息是: ${this.zidanList.length} / ${this.max_num}`
      : `没有子弹了`
  }
}

/**
 * @desc 子弹类
 */
class Zidan {
  constructor(shashangli) {
    this.shashangli = shashangli
  }
  // 击中敌人
  jizhong(laosong) {
    laosong.diaoxue(this.shashangli)
  }
}

// 1. 创建一个老王
var laowang = new Person('老王')

// 2. 创建一杆枪
var ak47 = new Gun('AK47')

// 3. 创建一个弹夹
var danjia = new Danjia(20)

// 安装一些子弹
for (let i = 0; i < 10; i++) {
    // 4. 创建一些子弹
  var zidan = new Zidan(10)

  // 5. 老王向弹夹中安装子弹
  laowang.anzhuangZidan(danjia, zidan)
}

// 6. 老王将弹夹安装到枪上
laowang.anzhuangDanjia(ak47, danjia)

// 7. 老王拿枪
laowang.naqiang(ak47)

// 8. 创建敌人老宋
laosong = new Person('老宋')

// 9. 老王扣扳机打老宋
for (let i = 0; i < 10; i++) {
    laowang.koubanjia(laosong)
  console.log(laowang.test())
  console.log(laosong.test())
}

Python写法:

# -*- coding: utf-8 -*-
class Person:
    def __init__(self, name):
        self.name = name
        self.gun = None
        self.hp = 100

    def anzhuang_zidan(self, danjia, zidan):
        danjia.save_zidan(zidan)

    def anzhuang_danjia(self, gun, danjia):
        gun.save_danjia(danjia)

    def naqiang(self, gun):
        self.gun = gun

    def kou_ban_ji(self, diren):
        self.gun.fire(diren)

    def diaoxue(self, sha_shang_li):
        self.hp -= sha_shang_li

    def __str__(self):
        if self.gun:
            return '%s的血量是%d, 他有枪,%s' % (self.name, self.hp, self.gun)
        else:
            if self.hp >= 0:
                return '%s的血量是%d, 没有枪' % (self.name, self.hp)
            else:
                return '%s挂了。。。' % self.name


class Gun:
    def __init__(self, name):
        self.name = name
        self.danjia = None

    def save_danjia(self, danjia):
        self.danjia = danjia

    def fire(self, diren):
        zidan_temp = self.danjia.tanchu_zidan(diren)
        if zidan_temp:
            zidan_temp.jizhong(diren)
        else:
            print('没有子弹了')

    def __str__(self):
        return '枪的信息是%s, %s' % (self.name, self.danjia)


class Danjia:
    def __init__(self, max_num):
        self.max_num = max_num
        self.zidan_list = []

    def save_zidan(self, zidan):
        self.zidan_list.append(zidan)

    def tanchu_zidan(self, diren):
        if self.zidan_list:
            return self.zidan_list.pop()
        else:
            return None

    def __str__(self):
        if self.zidan_list:
            return '弹夹的信息是:%d/%d' % (len(self.zidan_list), self.max_num)
        else:
            return '没有子弹了'


class Zidan:
    def __init__(self, sha_shang_li):
        self.sha_shang_li = sha_shang_li

    def jizhong(self, diren):
        diren.diaoxue(self.sha_shang_li)


# 老王开枪

def main():
    # 1. 创建一个老王
    laowang = Person('老王')

    # 2. 创建一杆枪
    ak47 = Gun('ak47')

    # 3. 创建一个弹夹
    danjia = Danjia(20)

    for i in range(0, 15):
        # 4. 创建一些子弹
        zidan = Zidan(10)
        # 5. 让老王把子弹装进弹夹
        laowang.anzhuang_zidan(danjia, zidan)

    # 6. 让老王把弹夹装到抢里
    laowang.anzhuang_danjia(ak47, danjia)

    # 7. 老王拿起枪
    laowang.naqiang(ak47)

    # 8. 创建一个敌人老宋
    laosong = Person('老宋')

    for i in range(0, 11):
        # 9. 老王扣扳机
        laowang.kou_ban_ji(laosong)
        print(laowang)
        print(laosong)
if __name__ == '__main__':
    main()

猜你喜欢

转载自blog.csdn.net/qq_33988065/article/details/80040995