1 1. 三合一 2 2. 当天练习独立完成 3 3. 指出案例中蕴含的理论: 4 (1)手雷爆炸 5 封装:手雷,玩家类,敌人类 6 继承:受害者 隔离 玩家类,敌人类与手雷 7 多态:玩家类,敌人类 重写 受害者的受伤方法 8 开闭原则:增加新的受害者,不影响手雷类 9 依赖倒置:手雷类调用受害者,而不调用玩家,敌人 10 11 (2)图形管理器 12 封装:图形管理器类,圆形类,矩形类 13 继承:图形类 隔离 圆形类,矩形类与图形管理器 14 多态:圆形类 矩形类 不影响图形管理类 15 开闭原则:添加新的图形,不影响图形管理器 16 依赖倒置:图形管理器调用图形类,不调用圆形类,矩形类 17 18 1. 老张开车去东北 19 封装:人类,汽车类,飞机类 20 继承:交通工具 隔离 汽车类,飞机类与人类。 21 多态:汽车类、飞机类 重写 交通工具的运输方法. 22 开闭原则:增加新的交通工具,不影响人类. 23 依赖倒置:人类调用交通工具,而不调用汽车、飞机. 24 25 4. (扩展)根据信息管理系统(MVC),完成购物车(MVC)。 26 5. 穷尽一切手段,在互联网上搜索面向对象三大特征相关资料. 27 结合课堂所讲,总结心得体会下来。
# demo01""" 继承 -- 语法 财产:钱不用孩子挣,但是可以花. 皇位:江山不用孩子打,但是可以坐. 代码:子类不用写,但是可以用. 练习:exercise01.py """ # 多个类具有相同成员,且都属于一种更大(宽泛)的概念 --> 继承 # 设计角度讲:先有子,再有父亲. # 编码角度讲:先有父亲,再有子. class Person: def say(self): print("说话") class Student(Person): # def say(self): # print("说话") def study(self): print("学习") class Teacher(Person): # def say(self): # print("说话") def teach(self): print("教学") # 测试: s01 = Student() s01.say() s01.study() p01 = Person() p01.say() t01 = Teacher() t01.say() t01.teach() # 内置函数 # 对象 --> 类型 # 学生对象 是 一个学生类型 True print(isinstance(s01,Student)) # 学生对象 是 一个人类型 True print(isinstance(s01,Person)) # 学生对象 是 一个老师类型False print(isinstance(s01,Teacher)) # 类型 --> 类型 # 学生类型 是 一个人类型 True print(issubclass(Student,Person)) # 学生类型 是 一个老师类型 False print(issubclass(Student,Teacher)) # 人对象 是 一个学生类型 False print(isinstance(p01,Student)) # 人类型 是 一个学生类型 False print(issubclass(Person,Student)) # 10:25 上课
# demo02
""" 继承 -- 数据 练习:exercise02.py """ class Person: def __init__(self, name=""): self.name = name class Student(Person): def __init__(self, name="", score=0): # 结论:创建子类对象,必须手动调用父类构造函数。 # 调用父类构造函数 --> 创建父类的数据 super().__init__(name) self.score = score s01 = Student("张无忌", 100) print(s01.score) print(s01.name)
# demo03
""" 继承 -- 设计角度 """ # 面向对象设计原则: # 开闭原则:开放 关闭 # 允许增加新功能 不改变(增加/删除/修改)"以前"的代码 # 老张开车去东北 # 需求变化:火车、飞机、坦克... class Person: def __init__(self, name=""): self.name = name def go_to(self, vehicle): print("去东北") # 如果参数是汽车 if type(vehicle) == Car: vehicle.run() # 否则如果是飞机 elif type(vehicle) == Airplane: vehicle.fly() class Car: def run(self): print("汽车行驶") class Airplane: def fly(self): print("飞机天上飞") c01 = Car() lz = Person() a01 = Airplane() lz.go_to(a01)
# demo04
""" 继承 -- 设计角度 15:20 """ # 面向对象设计原则: # 开闭原则:开放 关闭 # 允许增加新功能 不改变(增加/删除/修改)"以前"的代码 # 老张开车去东北 # 需求变化:火车、飞机、坦克... class Person: def __init__(self, name=""): self.name = name def go_to(self, vehicle): print("去东北") # 调用抽象的交通工具,而不调用更具体的汽车、飞机. vehicle.transport() class Vehicle: """ 抽象的 交通工具 """ def transport(self): pass # ----------------------------------------------------- class Car(Vehicle): def transport(self): print("汽车行驶") class Airplane(Vehicle): # ctrl + o # 重写(覆盖) def transport(self): print("飞机天上飞") c01 = Car() lz = Person() a01 = Airplane() lz.go_to(c01)
# demo06
""" 继承时,子类可以super()调用方法. """ class Granade: def __init__(self, atk=0): self.atk = atk def explode(self, sufferer): print("手雷爆炸啦") sufferer.damage(self.atk) class Sufferer: """ 抽象的受害者:隔离手雷与具体受害者的变化 """ def __init__(self, hp=0): self.hp = hp def damage(self, value): self.hp -= value # --------------------------- class Player(Sufferer): def damage(self, value): print("玩家受伤") # 个性 super().damage(value) # 共性 class Enemy(Sufferer): def damage(self, value): print("敌人受伤啦") # 个性 super().damage(value) # 共性 # 测试 g01 = Granade(50) p01 = Player(500) e01 = Enemy(100) g01.explode(e01) print(e01.hp)
# demo06
1 """ 2 总结 3 封装:分 4 继承:隔 5 多态:干 6 开闭原则:运行增加新功能,不修改以前代码. 7 依赖倒置:调用父类,不调用子。 8 9 1. 老张开车去东北 10 封装:人类,汽车类,飞机类 11 继承:交通工具 隔离 汽车类,飞机类与人类。 12 多态:汽车类、飞机类 重写 交通工具的运输方法. 13 开闭原则:增加新的交通工具,不影响人类. 14 依赖倒置:人类调用交通工具,而不调用汽车、飞机. 15 16 2. 手雷爆炸 17 封装: 18 继承: 19 多态: 20 开闭原则: 21 依赖倒置: 22 23 3. 图形管理器 24 封装: 25 继承: 26 多态: 27 开闭原则: 28 依赖倒置: 29 """
1 # exercise01 2 """ 3 练习: 4 创建三个类: 5 狗类(跑) 6 鸟类(飞) 7 动物(吃) 8 创建父类与子类对象,调用相关方法.体会 子类复用父类方法. 9 体会isinstance 与 issubclass 的异同. 10 """ 11 12 13 class Animal: 14 def eat(self): 15 print("吃") 16 17 18 class Dog(Animal): 19 def run(self): 20 print("跑") 21 22 23 class Bird: 24 def fly(self): 25 print("飞") 26 27 28 d01 = Dog() 29 d01.run() 30 d01.eat() 31 32 a01 = Animal() 33 a01.eat() 34 35 # 狗对象 是 是一种 动物类型 36 print(isinstance(d01, Animal)) 37 # 狗类型 是一种 动物类型 38 print(issubclass(Dog, Animal)) 39 # 狗对象 是 是一种 狗类型 40 print(isinstance(d01, Dog)) 41 42 # 狗对象 是 狗类型 True 43 print(type(d01) == Dog) 44 # 狗对象 是 动物类型 False 45 print(type(d01) == Animal)
# exercise02 """ 练习: 创建父类车(品牌,速度) 子类电动车(电池容量,充电功率) 创建父类对象,画出内存图。 创建子类对象,画出内存图. """ class Car: def __init__(self, brand="", speed=0.0): self.brand = brand self.speed = speed class Electrocar(Car): def __init__(self, brand="", speed=0.0, battery_capacity=0, charging_power=0): super().__init__(brand, speed) self.battery_capacity = battery_capacity self.charging_power = charging_power c01 = Car("宝马", 200) e01 = Electrocar("比亚迪", 200, 15000, 220)
# exercise03 """ 场景:手雷爆炸了,可能伤害敌人、玩家生命. 需求变化:还可能伤害房子、树、鸭子.... 要求:增加新事物,不影响手雷. 体会:开闭原则 画出架构设计图 """ # 面向对象设计原则: # 依赖倒置:调用抽象 class Granade: def __init__(self, atk=0): self.atk = atk def explode(self,sufferer): print("手雷爆炸啦") sufferer.damage(self.atk) class Sufferer: """ 抽象的受害者:隔离手雷与具体受害者的变化 """ def damage(self,value): pass # --------------------------- class Player(Sufferer): def __init__(self, hp=0): self.hp = hp def damage(self, value): print("玩家受伤") self.hp -= value class Enemy(Sufferer): def __init__(self, hp=0): self.hp = hp def damage(self, value): print("敌人受伤啦") self.hp -= value # 测试 g01 = Granade(50) p01 = Player(500) e01 = Enemy(100) g01.explode(e01)
# exercise04 """ 定义图形管理器 1. 记录多种图形(圆形 矩形 三角 ....) 2. 提供计算总面积的方法. 满足:开闭原则 依赖倒置 测试:创建图形管理器,存储多个图形对象。 通过图形管理器,调用计算总面积方法. """ # 17:15 class GraphicManager: def __init__(self): self.__list_graphic = [] def add_graphic(self, target): self.__list_graphic.append(target) def calculate_total_area(self): sum_value = 0 for item in self.__list_graphic: # 多态: # 调用的是图形计算面积方法 # 执行的是圆形、矩形计算面积方法. sum_value += item.calculate_area() return sum_value class Graphic: def calculate_area(self): """ 计算面积 :return: 当天图形的面积 """ pass class Circle(Graphic): def __init__(self, r): self.r = r def calculate_area(self): return 3.14 * self.r ** 2 class Rectanle(Graphic): def __init__(self, length=0, width=0): self.lenght = length self.width = width def calculate_area(self): return self.lenght * self.width manager = GraphicManager() manager.add_graphic(Circle(5)) manager.add_graphic(Rectanle(5, 6)) print(manager.calculate_total_area())
1 # review 2 3 """ 4 5 """ 6 7 8 class XXXController: 9 10 def add_student(self): 11 pass 12 13 14 class XXXView: 15 def __init__(self): 16 self.manager = XXXController() 17 18 def input_student(self): 19 self.manager.add_student() 20 21 def fun_xxx(self): 22 # self.manager.成员 23 pass 24 25 26 view = XXXView() 27 view.input_student()
1 # 测试代码 2 3 """ 4 场景:手雷爆炸了,可能伤害敌人、玩家生命. 5 需求变化:还可能伤害房子、树、鸭子.... 6 要求:增加新事物,不影响手雷. 7 体会:开闭原则 8 画出架构设计图 9 """ 10 11 # 面向对象设计原则: 12 # 依赖倒置:调用抽象 13 14 class Granade: 15 def __init__(self, atk=0): 16 self.atk = atk 17 18 def explode(self,sufferer): 19 print("手雷爆炸啦") 20 sufferer.damage(self.atk,sufferer.number) 21 # 在这个地方付给sufferer.number ==self.number = number 22 # 如果子类中没__init__ 直接调用 父类的__init__ 23 # 子类中有__init__ 间接调用 父类的super().__init__() 24 # 25 26 class Sufferer: 27 def __init__(self, hp=0, number=0): 28 self.hp = hp 29 self.number = number 30 31 def damage(self, value,value1): 32 print("玩家受伤") 33 self.hp -= value 34 self.number += value1 35 36 37 38 """ 39 抽象的受害者:隔离手雷与具体受害者的变化 40 """ 41 42 43 # --------------------------- 44 class Player(Sufferer): 45 46 def damage(self, value,value1): 47 super().damage(value,value1) 48 49 50 # def __init__(self, hp=0): 51 # self.hp = hp 52 53 54 55 56 57 58 # 测试 59 g01 = Granade(50) 60 p01 = Player(500,6) 61 62 63 g01.explode(p01) 64 print(p01.number)
来源:https://www.cnblogs.com/xiaoliangliu86/p/11529638.html