> 文档中心 > Python : 面向对象复习【三个案例及源码】

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由于需求不同,可以对父类方法分别进行改写,在创建子类对象并调用时,表现出不同效果。