封装
- 封装是面向对象编程的一大特点
- 面向对象编程的第一步——将属性和方法封装到一个抽象的类中
- 外界使用类创建对象,然后让对象调用方法
- 对象方法的细节都被封装在类的内部
- 一个对象的属性,可以是另一个类创建的对象
案例一:小明爱跑步
需求:
- 小明体重75.0公斤
- 小明每次跑步减肥0.5公斤
- 小明每次吃东西增加1公斤
类 | Person |
---|---|
属性 | name weight |
方法 | __init__(self, name, weight): __str__(self): run(self): ear(self): |
class Person:
def __init__(self, name, weight):
self.name = name
self.weight = weight
def __str__(self):
return "我的名字叫%s,我的体重是:%.2f" % (self.name, self.weight)
def eat(self):
print("%s 吃了一顿饭" % self.name)
self.weight += 1
def run(self):
print("%s 围着操场跑了几圈 " % self.name)
self.weight -= 0.5
ming = Person(name="小明", weight=75.0)
ming.eat()
ming.run()
ming.eat()
ming.run()
ming.run()
print(ming)
运行结果:
案例二:小明爱跑步扩展—小美也爱跑步
需求:
- 小明和小美都爱跑步
- 小明体重75.0公斤
- 小妹体重45.0公斤
- 每次跑步都会减少0.5公斤
- 每次吃东西都会增加1公斤
类 | person |
---|---|
属性 | name weight |
方法 | __init__(self, name, weight): __str__(self): run(self): ear(self): |
提示:
- 在对象的方法内部,是可以直接访问对象的属性的
- 同一个类创建多个对象之间,属性互不干扰
class Person:
def __init__(self, name, weight):
self.name = name
self.weight = weight
def __str__(self):
return "我的名字叫%s,我的体重是:%.2f" % (self.name, self.weight)
def eat(self):
print("%s 吃了一顿饭" % self.name)
self.weight += 1
def run(self):
print("%s 围着操场跑了几圈 " % self.name)
self.weight -= 0.5
ming = Person(name="小明", weight=75.0)
ming.run()
ming.eat()
print(ming)
mei = Person(name="小美", weight=45.0)
mei.eat()
mei.run()
print(mei)
print(ming)
运行结果:
案例三:摆放家具
需求:
1.房子(House)有户型、总面积 和 家具名称列表
- 新房子没有任何的加据
2.家具(HouseItem)有名字和占地面积,其中 - 席梦思(bed) 占地4平米
- 衣柜(chest) 占地2平米
- 餐桌(table) 占地1.5平米
3.将以上三件加据添加到房子里
4.打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表
类 | House |
---|---|
属性 | houst_type area free_area item |
方法 | __init__(self, house_type, area): __str__(self): add_item(self, item) : |
类 | HouseItem |
---|---|
属性 | name area |
方法 | __init__(self, name, area): __str__(self): |
剩余面积:
1.在创建房子对象时,定义一个剩余面积的属性,初始值和总面积相等
2.在调用add_item方法,向房间添加家具时候,让剩余面积 -= 家具面积
class HouseItem:
def __init__(self, name, area):
self.name = name
self.area = area
def __str__(self):
return "%s的占地面积为%.2f" % (self.name, self.area)
class House:
def __init__(self, layout, all_area):
self.layout = layout
self.all_area = all_area
self.remain_area = all_area
self.item = []
def __str__(self):
return "这是一个%s的房子,总面积为%.2f,有家具%s,剩余面积为%.2f" \
% (self.layout, self.all_area,
'、'.join(self.item), self.remain_area)
def add_item(self, item):
if item.area > self.remain_area:
print(" 剩余面积不足,%s无法添加" % item.name)
return
else:
self.item.append(item.name)
self.remain_area -= item.area
bed = HouseItem(name="席梦思", area=4)
chest = HouseItem(name="衣柜", area=2)
table = HouseItem(name="餐桌", area=1.5)
house = House(layout="三室两厅", all_area=90)
house.add_item(bed)
house.add_item(chest)
house.add_item(table)
print(house)
运行结果:
案例四:士兵突击
需求:
- 士兵许三多有一把AK47
- 士兵可以开火
- 枪能够发射子弹
- 强能够装填子弹——增加子弹数量
类 | Soldier |
---|---|
属性 | name gun |
方法 | __init(self)__ fire(self) |
类 | Gun |
---|---|
属性 | model bullet_count |
方法 | __init__(self, model) add_bullet(self, count) shoot(self) |
class Gun:
def __init__(self, model):
# 枪的型号
self.model = model
# 子弹的数量
self.bullet_count = 0
def add_bullet(self, count):
# 上弹
self.bullet_count += count
def shoot(self):
# 判断有无子弹
if self.bullet_count <= 0:
print("%s 没有子弹了..." % self.model)
return
# 发射子弹
self.bullet_count -= 1
# 提示发射信息
print("%s 突突突... 剩余子弹为:%d" % (self.model, self.bullet_count))
class Soldier:
def __init__(self, name):
# 假设新兵没有枪,可以用None初始化gun
self.gun is None
self.name = name
def fire(self):
# 判断士兵是否有枪
if self.gun == 0:
print("%s的还没有枪!!!" % self.name)
return
# 高喊口含
print("冲啊!!")
# 装弹
self.gun.add_bullet(30)
# 射击
self.gun.shoot()
# 定义枪对象
ak47 = Gun("AK47")
# 定义士兵对象
xsd = Soldier("许三多")
xsd.gun = ak47
print(xsd.gun)
xsd.fire()
执行结果: