面向对象速查笔记(二)
Published on 2018 - 01 - 09
需求:
1.士兵
许三多
有一把AK47
2.士兵
可以开火
3.枪
能够发射
子弹
4.枪
可以装填子弹
本篇重点:
一个对象的属性,可以是另外一个类创建的对象
class Gun:
"""
定义一个枪类,并且通过参数model传入枪支型号
"""
def __init__(self, model):
"""
bullet_count用作子弹计数,初始值为0,通过add_bullet方法增加子弹
"""
self.model = model
self.bullet_count = 0
def add_bullet(self, count):
"""
加子弹
:type count: 通过参数传入增加子弹的数量
"""
self.bullet_count += count
def shoot(self):
"""
射击Function,首先判断有没有子弹,没有子弹退出不再执行
"""
if self.bullet_count <= 0:
print("%s 无子弹" % self.model)
return
self.bullet_count -= 1
print("[%s] 子弹-1 剩余子弹 %d" %
(self.model, self.bullet_count))
class Soldier:
"""
定义一个士兵类,设置初始值姓名和枪型,
在定义属性时,如果不知道设置什么初始值,可以设置为None
"""
def __init__(self, name):
"""
重点重申:一个对象的属性,可以是另外一个类创建的对象
:param name: 传入的士兵姓名
:param self.gun:士兵初期是没有枪的,所以设置为None,通过Gun类传入到这里
"""
self.name = name
self.gun = None
def fire(self):
if self.gun is None:
print("士兵%s还没有装备枪" % self.name)
return
self.gun.add_bullet(10)
print("士兵[%s]开枪" % self.name)
self.gun.shoot()
ak47 = Gun("AK47")
soldier = Soldier("许三多")
"""
soldier的初始属性gun,是通过ak47这个对象传入的。
而ak47这个对象是由Gun类创建的,
所以说 "一个对象的属性,可以是另外一个类创建的对象
"""
soldier.gun = ak47
soldier.fire()
运行结果:
士兵[许三多]开枪
[AK47] 子弹-1 剩余子弹 9