Python : 面向对象复习【三个案例及源码】
案例及参考: 视频 P380-P406
说明:本文代码来源于自己的思考,与视频讲解不完全相同
黑马程序员Python教程_600集Python从入门到精通教程(懂中文就能学会)_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1ex411x7Em?p=380
目录
一. 复习案例:摆放家具【封装】
1. 需求
2. 源码
3. 效果
二、复习案例:士兵突击【封装】
1. 需求
2. 源码
3. 效果
三、复习案例:人狗玩耍【封装、继承、多态】
1. 需求
2. 源码
3. 效果
总结
一. 复习案例:摆放家具【封装】
1. 需求
2. 源码
main.py
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 add_item(self, item): if item.area > self.free_area: print("%s面积太大了,不能添加" % item.name) return else: self.free_area -= item.area self.item_list.append(item.name) def __str__(self): # 在外部访问对象时,打印时输出 return "户型:%s\n总面积:%.2f\n剩余面积:%.2f\n家具名称列表:%s" \ % (self.house_type, self.area, self.free_area, self.item_list)bed = HouseItem("席梦思", 4)chest = HouseItem("衣柜", 2)table = HouseItem("餐桌", 1.5)zax_house = House("两室一厅", 123)zax_house.add_item(bed)zax_house.add_item(chest)print(zax_house)
3. 效果
二、复习案例:士兵突击【封装】
1. 需求
① 人和枪:如果给吴京一把枪,如AK47,他可以进行冲锋,如果没有则不能。
② 开火操作:用AK47这把枪,假定开火射击一次,十发子弹耗尽,直到射击完成后才进行装填子弹。
③ 装填子弹:一次性装满至枪的最大容量。
设计类,并将属性和方法都封装到对应抽象的类中,在外部调用模拟冲锋过程。
2. 源码
main.py
# 每把枪的子弹的最大容量,可拓展,这里仅作示例Gun_dic = {"Ak47": 50, "AKM": 80}class Gun: def __init__(self, name): # 初始化枪的子弹,默认为0 self.name = name self.num = 0 def del_item(self): if self.num = Gun_dic[self.name]: return # 只要装弹,就直接装满 self.num += (Gun_dic[self.name] - self.num) print("装弹完成,准备射击!")class Soldier: def __init__(self, name): self.name = name self.gun = None def shoot(self): if self.gun == None: print("%s没有枪,不能射击" % self.name) return print("开火...") self.gun.del_item()ak47 = Gun("Ak47")xusanduo = Soldier("吴京")# ak47对象作为许三多对象的一个属性gunxusanduo.gun = ak47xusanduo.shoot()xusanduo.shoot()xusanduo.shoot()xusanduo.shoot()xusanduo.shoot()print("目前剩余子弹数:%d" % ak47.num)xusanduo.shoot()
3. 效果
三、复习案例:人狗玩耍【封装、继承、多态】
1. 需求
2. 源码
main.py
class Dog: def __init__(self, name): self.name = name def game(self): print("play game")class XiaoTianQuan(Dog): def game(self): print("play game in sky")class Person: def __init__(self, name): self.name = name def game_with_dog(self, dog): print("%s和%s玩"%(self.name,dog.name)) dog.game()zax=Person("小杨")xtq=XiaoTianQuan("哮天犬")zax.game_with_dog(xtq)
3. 效果
总结
Python中,面向对象三大特性:
封装:根据职责将属性和方法封装到一个抽象的类中,并在内部隐藏了对象属性和方法的细节。外界可以使用类来创建外部对象,以此调用方法。其中,外部对象只有通过 "."才可访问到对象的相关变量(非私有),在内部可以直接通过 self. 访问到。
继承:实现代码的重用,避免属性和方法的重写,当然必要时可以重写满足子类特定的需求,另外,多继承中,一个子类可以继承多个父类,继承时的顺序很重要,比如两个父类有同名方法,那么在调用时,先继承哪个就会使用哪个。比如class C(A,B):...就会用A中的方法。
多态:不同的子类对象调用相同的父类方法,产生不同的执行结果。可以增加代码的灵活度,当然,多态是以继承和重写父类方法为前提,因为要有不同的子类对象,如A和B类虽然继承自同一个父类,但是A和B由于需求不同,可以对父类方法分别进行改写,在创建子类对象并调用时,表现出不同效果。