目标 - 士兵突击案例
- 身份运算符
封装
1,封装 是面向对象编程的一大特点
2,面向对象编程的 第一步 -- 将 属性 和 方法 封装 到一个抽象的 类 中
3,外界 使用 类 创建 对象,然后 让对象调用方法
4,对象方法的细节 都被 封装 在 类的内部
一个对象的 属性 可以是**另一个类创建的对象
01,士兵突击
需求
1,士兵 许三多 有一把 AK47
2,士兵 可以 开火
3,枪 能够 发射* 子弹
4,枪** 装填 装填子弹 -- 增加子弹数量
class Gun:def __init__(self,model):self.model &#61; modeldef add_bullet(self,count):self.bullet_count &#61; countdef shoot(self):# 判读是否还有子弹if self.bullet_count <&#61; 0:print("[%s] 木有子弹啦&#xff0c;剩余 %d" % (self.model, self.bullet_count))return# 发射子弹self.bullet_count -&#61; 1print("%s 发射子弹 [%d]" % (self.model, self.bullet_count))# 创建枪对象ak47 &#61; Gun("AK47")ak47.add_bullet(50)ak47.shoot()# 结果呈现AK47 发射子弹 [49]
1.2 开发士兵类
假设&#xff1a;每一个新兵 都 没有枪
定义没有初始值的属性
在定义属性时&#xff0c;如果 不知道设置什么初始值&#xff0c;可以设置为 None
None
关键字 表示 什么都没有- 表示一个 空对象&#xff0c;没有方法和属性&#xff0c;是一个特殊的常量
- 可以将
None
赋值给任何一个变量
fire
方法需求
- 1> 判断是否有枪&#xff0c;没有枪不能出征
- 2> 喊一声口号
- 3> 装填子弹
- 4> 射击
class Gun:def __init__(self,model):self.model &#61; modeldef add_bullet(self,count):self.bullet_count &#61; countdef shoot(self):# 判读是否还有子弹if self.bullet_count <&#61; 0:print("[%s] 木有子弹啦&#xff0c;剩余 %d" % (self.model, self.bullet_count))return# 发射子弹self.bullet_count -&#61; 1print("%s 发射子弹 [%d]" % (self.model, self.bullet_count))class Soldier:def __init__(self, name):# 1,姓名self.name &#61; name# 2,枪 - 新兵没有self.gun &#61; Nonedef fire(self):# 1&#xff0c;判读士兵是否有枪if self.gun &#61;&#61; None:print("[%s] 没有枪&#xff0c;不可出征" % self.name)return# 2&#xff0c;高喊口号print("[%s] 端着 【%s】 冲冲冲" % (self.name, self.gun.model))# 3&#xff0c;装子弹self.gun.add_bullet(50)# 4&#xff0c;开枪self.gun.shoot()# 1&#xff0c;创建枪对象ak47 &#61; Gun("AK47")# ak47.add_bullet(50)# ak47.shoot()# 2&#xff0c;创建许三多xusanduo &#61; Soldier("许三多")xusanduo.gun &#61; ak47xusanduo.fire()print(xusanduo.gun)# 结果呈现[许三多] 端着 【AK47】 冲冲冲AK47 发射子弹 [49]<__main__.Gun object at 0x0000001C4C57EC18>
小结
1&#xff0c;创建了一个 士兵类 &#xff0c;使用 __init__
内置方法
2&#xff0c;在定义属性时&#xff0c;如果 不知道设置什么初始值&#xff0c;可以设置为 None
3&#xff0c;在 封装的 方法内部&#xff0c;还可以让 自己的 使用其他类创建的对象属性 调用已经 封装好的方法
02&#xff0c;身份运算符
身份运算符用于 比较 两个对象的 内存地址 是否一致 -- 是否是对同一个对象的引用
- 在
python
中针对None
比较时&#xff0c;建议使用is
判断
运算符 | 描述 | 实例 |
---|---|---|
is | is 是判断两个标识符是不是引用同一个对象 | x is y &#xff0c;类似 id(x) &#61;&#61; id(y) |
is not | is not 是判断两个标识符是不是引用不同对象 | x is not y &#xff0c;类似 id(x) !&#61; id(y) |
is 与 &#61;&#61; 区别&#xff1a;
is
用于判断 两个变量 引用对象是否为同一个&#61;&#61;
用于判断 引用变量的值 是否相等
In [1]: x &#61; [1, 2, 3]In [2]: y &#61; [1, 2]In [3]: id(x)Out[3]: 140113651590920In [4]: id(y)Out[4]: 140113663786184In [5]: y.append(3)In [6]: yOut[6]: [1, 2, 3]In [7]: id(y)Out[7]: 140113663786184In [8]: x &#61;&#61; yOut[8]: TrueIn [9]: x is yOut[9]: False
class Gun:def __init__(self,model):self.model &#61; modeldef add_bullet(self,count):self.bullet_count &#61; countdef shoot(self):# 判读是否还有子弹if self.bullet_count <&#61; 0:print("[%s] 木有子弹啦&#xff0c;剩余 %d" % (self.model, self.bullet_count))return# 发射子弹self.bullet_count -&#61; 1print("%s 发射子弹 [%d]" % (self.model, self.bullet_count))class Soldier:def __init__(self, name):# 1,姓名self.name &#61; name# 2,枪 - 新兵没有self.gun &#61; Nonedef fire(self):# 1&#xff0c;判读士兵是否有枪# if self.gun &#61;&#61; None:if self.gun is None:print("[%s] 没有枪&#xff0c;不可出征" % self.name)return# 2&#xff0c;高喊口号print("[%s] 端着 【%s】 冲冲冲" % (self.name, self.gun.model))# 3&#xff0c;装子弹self.gun.add_bullet(50)# 4&#xff0c;开枪self.gun.shoot()# 1&#xff0c;创建枪对象ak47 &#61; Gun("AK47")# ak47.add_bullet(50)# ak47.shoot()# 2&#xff0c;创建许三多xusanduo &#61; Soldier("许三多")xusanduo.gun &#61; ak47xusanduo.fire()print(xusanduo.gun)# 结果呈现[许三多] 端着 【AK47】 冲冲冲AK47 发射子弹 [49]<__main__.Gun object at 0x000000711CE8EBE0>