持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
1. 定义没有初始值的属性
在定义属性时,如果不知道设置什么初始值,可以将其值设置为None
- None关键字表示什么都没有
- 表示一个空对象,没有方法和属性,是一个特殊的常量
- 可以将None赋值给任何一个变量
2. 封装
- 封装是面向对象编程的一大特点
- 面向对象编程的第一步 -- 将属性和方法封装到一个抽象的类中
- 外界使用类创建对象,然后让对象调用方法
- 对象方法的细节都被封装在类的内部
注意:一个对象的属性可以是另外一个类创建的对象
3. 身份运算符
身份运算符用于比较两个对象的内存地址是否一致--是否是对同一个对象的引用
- 在Python中针对None比较时,建议使用is判断,这是一种编码规范。
| 运算符 | 描述 | 示例 |
|---|---|---|
| is | is是判断两个标识符是不是引用同一对象 | x is y,类似id(x)==id(y) |
| is not | is not 是判断两个标识符是不是引用不同对象 | x is not y,类似id(a) != id(b) |
is与==的区别:
- is 用于判断两个变量引用对象是否为同一个
- ==用于判断引用变量的值是否相等
4. 案例演示
案例要求:士兵突击案例
- 士兵许三多有一把AK47
- 士兵可以开火
- 枪能够发射子弹
- 枪装填子弹--增加子弹数量 代码示例如下所示:
"""
士兵突击
需求
- 士兵许三多有一把AK47
- 士兵可以开火
- 枪能够发射子弹
- 枪装填子弹--增加子弹数量
"""
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))
class Soldier:
def __init__(self, name):
# 1. 姓名
self.name = name
# 2. 枪 - 新兵没有枪
self.gun = None
def fire(self):
# 1. 判断士兵是否有枪
if self.gun is None: # 使用is身份运算符
print("[%s] 还没有枪..." % self.name)
return
# 2. 高喊口号
print("冲啊...[%s]" % self.name)
# 3. 让枪装填子弹
self.gun.add_bullet(50)
# 4. 让枪发射子弹
self.gun.shoot()
# 1. 创建枪对象
ak47 = Gun("AK47")
ak47.add_bullet(50)
ak47.shoot()
# 2. 创建许三多
xusanduo = Soldier("许三多")
xusanduo.gun = ak47
xusanduo.fire()
print(xusanduo.gun)
运行结果如下所示:可以看出程序中,使用Sodier类中的fire方法调用了Gun类中的add_bullet方法,使得案例更加灵活。