目标:
- 封装
- 案例1:小明爱跑步
- 案例2:存放家具
01 封装
- 封装是面向对象编程的一大特点。
- 面向对象编程的第一步——将属性和方法 封装到一个抽象的类中。
- 外界使用类创建对象然后 让对象调用方法。
- 对象方法的细节 都被封装在类的内部。
02 小明爱跑步
需求:
- 小明体重 75.0 公斤
- 小明每次跑步会减肥 0.5 公斤
- 小明每次吃东西体重会增加 1 公斤
提示:
- 在 对象的方法内部,是可以直接访问对象的属性的
- 同一个类 创建的多个对象之间,属性互不干扰
class Person: def __init__(self,name,weight): # self.属性 = 形参 self.name = name self.weight = weight def __str__(self): return "我的名字是 %s ,体重为 %.2f 公斤" % (self.name,self.weight) def run(self): self.weight -= 0.5 def eat(self): self.weight += 1 xiaoming = Person("小明",75) xiaoming.run() xiaoming.eat() print(xiaoming) xiaomei = Person("小美",45) xiaomei.eat() xiaomei.run() print(xiaomei)
02 摆放家具
需求:
房子(House)有户型、总面积 和家具名称列表(新房子中没有家具)
家具(Houseitem)有名字和占地面积,其中:
席梦思(bed)占地4平米
衣柜(chest)占地2平米
餐桌(table)占地1.5平米
将以上三件家具添加到房子中
打印房子时,要求输出:户型、总面积、剩余面积、家居名称列表
提示:应该先开发哪一个类?应该是家具类。不仅因为家具类简单,更重要的是房子类中要使用到家具类,被使用的类,通常应该先开发。
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, House_type, area): self.House_type = House_type self.area = area # 剩余面积 self.free_area = area # 家居名称列表 self.item_list = [] def __str__(self): # python 能够自动的将一对括号内部的代码连接在一起 return ("户型:%s \t 总面积:%s \t 剩余面积:%s \n家具:%s" % (self.House_type, self.area, self.free_area, self.item_list)) def add_item(self, item): print("添加%s" % item) # 判断要添加的家具面积是否超过剩余面积,如果超过,提示不能添加 if item.area > self.free_area: print("%s的面积过大,无法添加" % item.name) return # 将家具名称追加到家居名称列表中 self.item_list.append(item.name) # 用房子的剩余面积-添加的家具面积 self.free_area -= item.area # 创建家具 bed = HouseItem("席梦思",40) chest = HouseItem("衣柜",20) table= HouseItem("餐桌",1.5) print(bed) print(chest) print(table) # 创建房子 my_home = House("两室一厅",60) my_home.add_item(bed) my_home.add_item(chest) my_home.add_item(table) print(my_home)