多态:同样的行为(函数),传入不同的对象,得到不同的状态
特点:通过继承的方式体验抽象动作相同而具体实现细节不同细节的特性
如,定义函数(方法),通过类型注解声明需要父类对象,实际传入子类对象进行工作,从而获得不同的工作状态
条件:
- 继承:多态一定是发生在子类和父类之间;
- 重写:子类重写了父类的方法。
实例理解:
class Animal: def speak(self): pass class Dog(Animal): #既然继承了父类Animal 的方法,为什么还要自己重新写一个方法呢 def speak(self): # 重写 print("汪 汪 汪") #重写 class cat(Animal): def speak(self): # 重写 print("喵 喵 喵") dog = Dog() dog.speak() cat = cat() cat.speak()
关于子类对父类的重写,在前面讲过,子类继承了父类,那么子类就会拥有父类所有的类属性和类方法。一般情况下这些方法和属性是适合子类使用的,子类会在此基础上,做一些修改。关于在子类中对继承的父类属性和方法做的这些修改就叫重写
关于pass 的释义:pass 是一种空语句(null operation),解释器执行到它的时候,除了检查语法是否合法,什么也不做就直接跳过,它不会对所处的作用域产生任何影响,充当一个空间占位符。
抽象类(接口):包含抽象方法的类,称之为抽象类。抽象方法是指:没有具体实现的方法(pass)称之为抽象方法。
抽象类的作用:
多用于做顶层设计(设计标准),以便子类做具体实现。
也是对子类的一种软性约束,要求子类必须复写(实现)父类的一些方法并配合多态使用,获得不同的工作状态。
实例解释:
class AC: 父类方法 def cool_wind(self): """ 制冷""" pass def hot_wind(self): """ 制热""" pass def swing_l_r(self): """ 左右摆风""" pass class Mide_AC(AC): def cool_wind(self): print("美的空调核心制冷科技") def hot_wind(self): print("美的空调电热丝加热") def swing_l_r(self): print("美的空调无风感左右摆风") 子类将继承的方法重写 class GREE_AC(AC): def cool_wind(self): print("格力空调变频省电制冷") def hot_wind(self): print("格力空调电热丝加热") def swing_l_r(self): print("格力空调无静音左右摆风") 配合多态,完成 抽象的父类设计(设计标准) 具体的子类实现(实现标准 def make_cool(ac:AC): ac.cool_wind() midea_ac = Mide_AC() gree_ac = GREE_AC() make_cool(midea_ac) make_cool(gree_ac)
为什么提出抽象类接口,是为了配合多态使用 ,通过以获得同一行为, 实现不同状态的效果。
在抽象类接口中,父类来确定要实现的事务(实现制冷、制热、左右摆风),具体的实现过程由子类实现(美的空调是核心制冷科技,格力空调是变频省电制冷)它们的具体实现技术手段是不一样的【这是体现了我们将的多态,同一函数,传入不同的对象返回了不同状态】,子类通过复写父类的方法来实现。
总结: (论语二则)
知者不惑,仁者不忧,勇者不惧
朝闻道,夕死可矣