面向对象封装案例II
目标
● 士兵突击案例
● 身份运算符
封装
1、封装是面向对象编程的一大特点
2、面向对象编程的第一步——将属性和方法封装到类中
3、外界使用类创建对象,然后让对象调用方法
4、对象方法的细节都被封装在类的内部
一个类的属性可以是另一个类创建的对象
01.士兵突击
需求:
1、士兵 许三多有一把AK47
2、士兵可以开火
3、枪能够发射子弹——减少子弹数量
4、枪装填子弹——增加子弹数量
1.1 开发枪类
shoot 方法需求:
● 1)判断子弹数量
● 2)发射子弹,子弹数 -1
● 3)提示发射信息
class Gun:
def __init__(self, model):
# 1、枪的型号
self.model = model
# 2、子弹的数量
self.bullet_count = 0
def add_bullet(self, count):
self.bullet_count += count
def shoot(self):
# 1、判断子弹数量
if self.bullet_count <= 0:
print("【%s】枪中无子弹,需要装填!" % self.model)
return
# 2、发射子弹 子弹数量 - 1
self.bullet_count -= 1
# 3、提示发射信息
print("[%s] 发射子弹【%d】" % (self.model, self.bullet_count))
# 1、创建枪对象
ak47 = Gun("AK47")
ak47.add_bullet(50)
ak47.shoot()
1.2 开发士兵类
假设每个新兵都没有枪
定义没有初始值的属性
在定义属性时,如果不知道设置什么初始值,可以设置为None
● None 关键字表示什么都没有
● 表示一个空对象,没有方法和属性,是一个特殊的常量
● 可以将None 赋值给任何一个变量
class Soldier:
def __init__(self, name):
# 1、姓名
self.name = name
# 2、枪属性
self.gun = None
# 1、创建枪对象
ak47 = Gun("AK47")
ak47.add_bullet(50)
ak47.shoot()
# 创建许三多
xusanduo = Soldier("许三多")
xusanduo.gun = ak47
print(xusanduo.gun)
fire方法需求:
● 1)判断是否有枪,没有枪没法冲锋
● 2)喊一声口号
● 3)装填子弹
● 4)射击
class Soldier:
def __init__(self, name):
# 1、姓名
self.name = name
# 2、枪属性,新兵没有枪
self.gun = None
def fire(self):
# 1、判断是否有枪
if self.gun == 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")
# 创建许三多
xusanduo = Soldier("许三多")
xusanduo.gun = ak47
xusanduo.fire()
print(xusanduo.gun)
小结
1、创建了一个士兵类,使用到 __ init __ 内置方法
2、在定义属性时,如果不知道设置什么初始值,可以设置为None
3、在封装方法内部,还可以让自己的使用其他类创建的对象属性 调用封装好的方法
02.身份运算符
身份运算符用于比较两个对象的内存地址是否一致——是否是对同一个对象的引用
● 在Python中,针对None 的比较时,建议使用 is 判断
运算符 | 描述 | 实例 |
---|---|---|
is | is 是判断两个标识符是不是引用同一个对象 | x is y,类似于id(x) == id(y) |
is not | is not 是判断两个标识符是不是引用不同对象 | x is not y, 类似于 id(x) != id(y) |
is 与 == 的区别:
is 用于判断两个变量引用对象是否为同一个人
==用于判断引用对象的值是否相等