01_封装

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

02_小明爱跑步

需求

  • 小明 和 小美 都爱跑步
  • 小明 体重 100.0 公斤
  • 小美 体重 120.0 公斤
  • 每次 跑步 都会减少 0.5 公斤
  • 每次 吃东西 都会增加 1 公斤

代码实现

class Person:
    def __init__(self, name, weight, run_num, eat_num):
        # self.属性 = 形参
        self.name = name
        self.weight = weight
        self.run_num = run_num
        self.eat_num = eat_num

    def __str__(self):
        return "%s 现在的体重为 %s" % (self.name, self.weight)

    def run(self):
        self.weight -= 0.5 * self.run_num
        print("%s 跑步后的体重为:%s" % (self.name, self.weight))

    def eat(self):
        self.weight += self.eat_num
        print("%s 吃东西后的体重为:%s" % (self.name, self.weight))


Tom = Person("Tom", 100, 1, 1)
Tom.run()
Tom.eat()
print(Tom)

print()

# 同一个类 创建的 多个对象 之间,属性 互不干扰
Jack = Person("Jack", 120, 2, 2)
Jack.run()
Jack.eat()
print(Jack)

提示

  • 在 对象的方法内部,是可以 直接访问对象的属性 的!
  • 同一个类 创建的 多个对象 之间,属性 互不干扰!

03_摆放家具

需求

  • 房子(House) 有 户型、总面积 和 家具名称列表
     i.新房子没有任何的家具
  • 家具(HouseItem) 有 名字 和 占地面积,其中
     i.床(bed)地 4 平米
     ii.衣柜(chest) 占地 2 平米
     iii.餐桌(table) 占地 1.5 平米
  • 将以上三件 家具 添加 到 房子 中
  • 打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表

创建家具

  • 使用到 __init____str__两个内置方法
  • 使用 家具类 创建了 三个家具对象,并且 输出家具信息

创建房子

  • 使用到 __init____str__两个内置方法
  • 准备了一个 add_item 方法 准备添加家具
  • 使用 房子类 创建了 一个房子对象
  • 让 房子对象 调用了三次 dd_item方法,将 三件家具 以实参传递到 dd_item内部

代码实现

class HouseItem:
    def __init__(self, name, area):
        self.name = name
        self.are = area

    def __str__(self):
        return "%s 占地:%.2f" % (self.name, self.are)


class House:
    def __init__(self, house_type, area):
        self.house_type = house_type
        self.area = area
        self.free_area = area
        self.item_list = []

    def __str__(self):
        return "房子的户型:%s \n总面积:%.2f \n剩余面积:%.2f \n家具名称列表:%s" % \
               (self.house_type, self.area, self.free_area, self.item_list)

    def add_item(self, item):
        self.item_list.append(item.name)
        self.free_area -= item.are


# 创建家具
bed = HouseItem("床", 4)
chest = HouseItem("衣柜", 2)
table = HouseItem("餐桌", 1.5)
print(bed)
print(chest)
print(table)
print()

# 创建房子
my_home = House("两室一厅", 60)
my_home.add_item(bed)
my_home.add_item(chest)
my_home.add_item(table)
print(my_home)

小结

  • 主程序只负责创建 房子 对象和 家具 对象
  • 让 房子 对象调用 dd_item方法 将家具添加到房子中
  • 面积计算、剩余面积、家具列表 等处理都被 封装 到 房子类的内部

04_士兵突击

需求

  • 士兵 许三多 有一把 AK
  • 士兵 可以 开火
  • 枪 能够 发射 子弹
  • 枪 装填 装填子弹 —— 增加子弹数量

开发枪类

  • 判断是否有子弹,没有子弹无法射击
  • 使用 print 提示射击,并且输出子弹数量

开发士兵类

  • 假设:每一个新兵 都 没有枪

定义没有初始值的属性

  • 在定义属性时,如果 不知道设置什么初始值,可以设置为None
  • None 关键字 表示 什么都没有
  • 可以将 None赋值给任何一个变量

代码实现

class Gun:
    def __init__(self, name):
        self.name = name
        self.bullet_num = 0
        print("士兵的枪是:%s" % self.name)

    def __str__(self):
        return "剩余的子弹数为:%d" % self.bullet_num

    def add_bullet(self, num):
        self.bullet_num += num
        print("子弹填充完成,现在的子弹数为:%d" % self.bullet_num)

    def shoot(self):
        if self.bullet_num <= 0:
            print("%s 没有子弹了" % self.name)
            return

        self.bullet_num -= 1
        print("子弹发射完成,现在的子弹数为:%d" % self.bullet_num)


class Soldier:
    def __init__(self, name):
        self.name = name
        # 新兵没有枪
        self.gun = None
        print("士兵的名字叫:%s" % self.name)

    def fire(self):
        if self.gun is None:
            print("士兵 %s 还没有枪" % self.name)
        self.gun.add_bullet(10)
        self.gun.shoot()
        print("士兵 %s 开火一次" % self.name)


AK = Gun("AK")

soldier = Soldier("许三多")
# 在内部添加属性 在外部修改属性
soldier.gun = AK
soldier.fire()

小结

  • 创建了一个 士兵类,使用到 __init__内置方法
  • 在定义属性时,如果 不知道设置什么初始值,可以设置为None
  • 在 封装的 方法内部,还可以让 自己的 使用其他类创建的对象属性 调用已经 封装好的方法

05_身份运算符

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

  • 在 Python 中针对None比较时,建议使用is判断

is 与 == 区别:

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