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