士兵突击
重点理解:一个对象的属性,可以是另一个类创建的对象。
项目需求:
1、士兵许三多有一把AK47
2、士兵可以开火
3、枪能够发射子弹
4、枪能够装填子弹
项目分析:
根据项目需求,可以提炼出两个类,枪和人。
枪类的属性有:名字、子弹数量
枪类的方法有:装填子弹、射出子弹
人类的属性有:名字、枪
人类的方法有:开火
因为许三多需要使用AK47,所以我们应该首先开发枪类。
项目开发:
开发枪类:
在开发枪对象的shoot
方法时,要先判断枪是否还有子弹,如果没有,需要直接使用return
关键字停止执行下面的代码。
class Gun:def __init__(self, name):self.name = nameself.bullets = 0def add_bullet(self, count):self.bullets += countdef shoot(self):if self.bullets <=0:print("%s没有子弹了" % self.name)returnself.bullets -= 1print("突突突,%s还有%d发子弹" % (self.name, self.bullets))ak47 = Gun("AK47")ak47.add_bullet(5)ak47.shoot()
开发士兵类:
假设每个新兵都没有枪。因为新兵没有枪,所以需要通过形参传递的属性只有name一个。在使用士兵类创建好许三多对象之后,可以使用赋值语句将AK47赋值给许三多的枪属性。
在定义属性的时候,如果不知道设置什么初始值,可以设置为None
,这样就避免了在外部给对象设置属性。
None关键字表示什么都没有,表示一个空对象,没有方法和属性,是一个特殊的常量,可以将None赋值给任何一个变量。
在开发士兵类的fire
方法的时候:
1、判断是否有枪
2、喊一声口号
3、装填子弹
4、射击
class Solider:def __init__(self, name):self.name = nameself.gun = Nonedef fire(self):# 判断士兵是否有枪if self.gun is None:print("%s还没有枪"% self.name)return# 喊一声口号print("冲啊。。。。")# 装填子弹self.gun.add_bullet(5)# 开火self.gun.shoot()xusanduo = Solider("许三多")xusanduo.gun = ak47xusanduo.fire()
这节课的重点是,一个对象的属性,可以是另外一个类创建的对象,所以在士兵开枪的时候,就可以调用封装在枪类里面的装填子弹和发射子弹的方法。
在判断士兵有没有枪的时候,用了身份运算符is
is
用于判断两个变量引用对象是否为同一个
==
用于判断引用变量的值是否相等
>>> a = [1, 2, 3]>>> b = [1, 2, 3]>>> b is aFalse>>> b == aTrue