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
用于判断 两个变量 引用对象是否为同一个
== 用于判断 引用变量的值 是否相等