1、面向对象封装案例II——士兵突击
目标
士兵突击案例身份运算符封装
封装是面向对象编程的一大特点面向对象编程的第一步—— 将属性和方法封装到一个抽象的类中外界使用类创建对象,然后让对象调用方法对象方法的细节都被封装在类的内部
一个对象的属性可以是另外一个类创建的对象
士兵突击
需求
士兵许三多有一把AK47士兵可以开火枪能够发射子弹枪装填装填子弹——增加子弹数量
这里有两个类,一个士兵(Soldier),一个枪(Gun);
士兵类中有两个属性:name和gun;一个方法:fire(开火)
枪类中有两个属性:model(枪类)和buttet_count(子弹数);两个方法:add_buttet(装填子弹)和shoot(发射)。
这里的枪类包含在士兵类,所以写代码的时候先写士兵类。
代码演示步骤1:开发枪类
shoot
方法需求
1> 判断是否有子弹,没有子弹无法射击2> 使用print
提示射击,并且输出子弹数量
class Gun:def __init__(self, model):# 1. 枪的型号self.model = model# 2. 子弹的数量self.bullet_count = 0def add_bullet(self, count):# 用子弹数量这个属性与传递进来的形参做个相加self.bullet_count += countdef shoot(self):# 1. 判断子弹数量if self.bullet_count <= 0:print("[%s] 没有子弹了..." % self.model)return# 2. 发射子弹,-1self.bullet_count -= 1# 3. 提示发射信息print("[%s] 突突突... [%d]" % (self.model, self.bullet_count))# 1. 创建枪对象ak47 = Gun("AK47")ak47.add_bullet(50)ak47.shoot()
代码演示步骤2:开发士兵类
假设:每一个新兵 都没有枪
None的使用!定义没有初始值的属性:
在定义属性时,如果不知道设置什么初始值,可以设置为None
None
关键字表示什么都没有表示一个空对象,没有方法和属性,是一个特殊的常量可以将None
赋值给任何一个变量
fire
方法需求
1> 判断是否有枪,没有枪没法冲锋2> 喊一声口号3> 装填子弹4> 射击
注: 在给对象添加属性时,不要再外界添加这个属性,而应该在初始化方法内部,先把属性添加好。如果想要修改这个属性的值,可以再在外部使用赋值语句给这个属性赋值一个新对象就可以。
class Gun:def __init__(self, model):# 1. 枪的型号self.model = model# 2. 子弹的数量self.bullet_count = 0def add_bullet(self, count):self.bullet_count += countdef shoot(self):# 1. 判断子弹数量if self.bullet_count <= 0:print("[%s] 没有子弹了..." % self.model)return# 2. 发射子弹,-1self.bullet_count -= 1# 3. 提示发射信息print("[%s] 突突突... [%d]" % (self.model, self.bullet_count))class Soldier:def __init__(self, name):# 1. 姓名self.name = name# 2. 枪 - 新兵没有枪self.gun = None# 1. 创建枪对象ak47 = Gun("AK47")ak47.add_bullet(50)ak47.shoot()# 2. 创建许三多xusanduo = Soldier("许三多")xusanduo.gun = ak47print(xusanduo.gun)
代码演示步骤3:开发士兵开火
class Gun:def __init__(self, model):# 1. 枪的型号self.model = model# 2. 子弹的数量self.bullet_count = 0def add_bullet(self, count):self.bullet_count += countdef shoot(self):# 1. 判断子弹数量if self.bullet_count <= 0:print("[%s] 没有子弹了..." % self.model)return# 2. 发射子弹,-1self.bullet_count -= 1# 3. 提示发射信息print("[%s] 突突突... [%d]" % (self.model, self.bullet_count))class Soldier:def __init__(self, name):# 1. 姓名self.name = name# 2. 枪 - 新兵没有枪self.gun = Nonedef fire(self):# 1. 判断士兵是否有枪# if self.gun == None:if self.gun is None:print("[%s] 还没有枪..." % self.name)return# 2. 高喊口号print("冲啊...[%s]" % self.name)# 3. 让枪装填子弹self.gun.add_bullet(50)# 4. 让枪发射子弹self.gun.shoot()# 1. 创建枪对象ak47 = Gun("AK47")# 2. 创建许三多xusanduo = Soldier("许三多")xusanduo.gun = ak47xusanduo.fire()print(xusanduo.gun)
一个对象的属性可以是另外一个类创建的对象
小结
创建了一个士兵类,使用到__init__
内置方法在定义属性时,如果不知道设置什么初始值,可以设置为None
在封装的方法内部,还可以让自己的使用其他类创建的对象属性调用已经封装好的方法
2、身份运算符:
身份运算符用于比较两个对象的内存地址是否一致 ——是否是对同一个对象的引用
在Python
中针对None
比较时,建议使用is
判断
is 与 == 区别:
is
用于判断两个变量 引用对象是否为同一个
==
用于判断引用变量的值是否相等
————————————————————————————————————————————————————————
博客记录日常学习内容~