多态:指的是同一种/类事物的不同形态
例如动物类,有人,狗,猪等形态
为何要用多态
多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象
多态性的精髓:统一
多态的使用
class Animal:
def speak(self):
pass
class People(Animal):
def speak(self):
print('say hello')
class Dog(Animal):
def speak(self):
print('汪汪汪')
class Pig(Animal):
def speak(self):
print('哼哼哼')
obj1=People()
obj2=Dog()
obj3=Pig()
obj1.speak()
obj2.speak()
obj3.speak()
# Animal() # 父类只是用来建立规范的,不能用来实例化的,
#更无需实现内部的方法
这样,只要是动物,不管是哪一种形态,都可以直接调用speak方法,也就是说,只用记住父类animal的一套标准就可以了
如果下面的子类并不按照父类的标准去做,也不会报错
因此,python提供了一个abc模块
使用方法:
首先导入abc模块
import abc
然后再定义父类后面加上(metaclass=abc.ABCMeta)
class Animal(metaclass=abc.ABCMeta):
最后在speak方法上面加上装饰器@abc.abstractmethod
@abc.abstractmethod
def speak(self):
pass
这样只要继承了Animal这个类,里面就必须有装饰器下面的代码,没有就会报错,如果装饰器装饰了speak与run方法,则子类必须有叫'speak'与'run'的方法
但是python并不推崇这种做法,因为python一直追求的是约定俗成的
所以我们用鸭子类型,鸭子类型:只要长得像鸭子,叫声像鸭子,那么这就是鸭子
这跟linux里的一切皆文件很像,文件只有读和写两种操作
代码实现:
class Disk:
def read(self):
print('Disk read')
def write(self):
print('Disk write')
class Memory:
def read(self):
print('Mem read')
def write(self):
print('Mem write')
class Cpu:
def read(self):
print('Cpu read')
def write(self):
print('Cpu write')
obj1=Disk()
obj2=Memory()
obj3=Cpu()
obj1.read()
obj2.read()
obj3.read()
这样只用记住read与write的用法就可以了