Python-面向对象编程-封装案例

133 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

1. 定义没有初始值的属性

在定义属性时,如果不知道设置什么初始值,可以将其值设置为None

  • None关键字表示什么都没有
  • 表示一个空对象,没有方法和属性,是一个特殊的常量
  • 可以将None赋值给任何一个变量

2. 封装

  1. 封装是面向对象编程的一大特点
  2. 面向对象编程的第一步 -- 将属性和方法封装到一个抽象的类中
  3. 外界使用类创建对象,然后让对象调用方法
  4. 对象方法的细节都被封装在类的内部

注意:一个对象的属性可以是另外一个类创建的对象

3. 身份运算符

身份运算符用于比较两个对象的内存地址是否一致--是否是对同一个对象的引用

  • 在Python中针对None比较时,建议使用is判断,这是一种编码规范。
运算符描述示例
isis是判断两个标识符是不是引用同一对象x is y,类似id(x)==id(y)
is notis not 是判断两个标识符是不是引用不同对象x is not y,类似id(a) != id(b)

is==的区别:

  • is 用于判断两个变量引用对象是否为同一个
  • ==用于判断引用变量的值是否相等

4. 案例演示

案例要求:士兵突击案例

  1. 士兵许三多有一把AK47
  2. 士兵可以开火
  3. 枪能够发射子弹
  4. 枪装填子弹--增加子弹数量 代码示例如下所示:
"""
士兵突击
需求
- 士兵许三多有一把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方法,使得案例更加灵活。

image.png