什么是多态: 一种事物具有多种形态,如水具有液态水,气态水......
多态性:
多态性分为动态多态性与静态多态性
静态多态性:任何数据类型都可以使用运算符+进行运算,而运算的结果是不同的(运算符的意义取决于被操作对象)
动态多态性:继承一个类的多个子类中拥有相同的方法名,那么这些子类产生的对象就可以不用考虑具体的类型,直接去调用类的功能,精髓是统一,例如:我们经常使用len()这个内置函数(实际上是调用了__len__方法)去得到一个数据类型的长度(我们并不会去考虑被操作的对象到底是什么数据类型,只需要知道它是可迭代的),而不是每个数据类型各使用一种与其对应的方法
例如,我们将人的说话技能和猫叫都定义为speak()函数,那么使用者在使用的过程中根本不需要去考虑人应该调用什么,猫应该调用什么,只需要知道有一个speak()方法,甚至我们可以定义一个接口函数func,不管什么类型的对象进来,只需要他有一个speak方法就可以,这大大降低了使用者的操作难度
class People(): def speak(self): print('say hello') class Cat(): def speak(self): print('喵喵') def func(obj): obj.speak() obj1 = People() obj2 = Cat() func(obj1) func(obj2)
如何强制的达到统一的效果?
通过接口
接口提取了一群类的共同函数,可以将接口理解为这些函数的集合,然后我们让子类去实现这些接口内的函数,这样的好处在于
实现了归一化(所有基于一个接口实现的类,这些类实例化的对象在使用时,他们的用法是一致的),
而归一化的好处在于:
1.对象的使用者不必考虑对象的类具体是什么,只要关心对象拥有什么样的功能,极大的降低了使用者的使用难度
2.对于高层的外部使用者可以不区分的处理所有接口兼容的对象集合(例如linux的一切皆文件,所有的东西都可以当作文件去操作,而不必去考虑是硬盘还是内存)
python中并没有定制接口的关键字interface,所以需要用到抽象类抽象类的概念:
基于类抽象而来的(类是基于对象的抽象而来的),只能被继承,不能被调用(只有抽象方法而没有实现功能),且子类必须实现抽象方法
但是python并不支持这么做(大家都是成年人了),python推崇的是鸭子类型,只要你叫的像鸭子并且走路也像鸭子,那么你就是鸭子,python推崇的是约定俗成import abc class AllFile(metaclass=abc.ABCMeta): def read(self): pass #规定子类必须要有read功能 def write(self): pass #规定子类必须要有write功能 class Txt(AllFile): def read(self): print('正在读取文本...') def write(self): print('正在编辑文本...') class Process(AllFile): def read(self): print('正在加载进程...') def write(self): print('正在修改进程...') txt = Txt() pro = Process() txt.read() pro.read() #实现了归一化 # 抽象类是介于类与接口之间的,强调数据属性与函数属性的相似