目录
一、什么是多态?
一类事物有多种不同的形态,如:动物有猫、狗、鸡等。
二、多态性
所谓多态性指的是不管各对象是什么数据类型就直接使用各对象中统一的方法函数。 从一定程度上增强了程序的灵活性和可扩展性。
实现条件:
①子类要继承父类
②子类与父类具有相同的方法函数。
class Animal: #同一类事物:动物
def talk(self):
pass
class Cat(Animal): #动物的形态之一:猫
def talk(self):
print('喵喵喵')
class Dog(Animal): #动物的形态之二:狗
def talk(self):
print('汪汪汪')
class Pig(Animal): #动物的形态之三:猪
def talk(self):
print('哼哼哼')
#实例化得到三个对象
>>> cat=Cat()
>>> dog=Dog()
>>> pig=Pig()#使用统一的函数接口来调用各对象统一的方法
>>> def Talk(animal):
... animal.talk()
...
>>> Talk(cat)
喵喵喵
>>> Talk(dog)
汪汪汪
>>> Talk(pig)
哼哼哼
三、abc抽象类模块
定义抽象父类。抽象父类本身不能实例化,而是用来限制子类必须要有的方法函数,否则子类在实例化对象时会报类型错误。
import abc
# 指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod # 该装饰器限制子类必须定义有一个名为talk的方法
def talk(self): # 抽象方法中无需实现具体的功能
pass
class Cat(Animal): # 但凡继承Animal的子类都必须遵循Animal规定的标准
def talk(self):
pass
cat=Cat() # 若子类中没有一个名为talk的方法则会抛出异常TypeError,无法实例化
四、鸭子类型
不管某物对象是不是真正的鸭子,只要外观(属性)和行为(方法)上看起来像鸭子,那么就认为它就是个鸭子。例如: 定义两个属性和方法都相同的、但没有继承关系的类(具有多态性)。
#二者看起来都像文件,因而就可以当文件一样去用,然而它们并没有直接的关系
class Txt: #Txt类有两个与文件类型同名的方法,即read和write
def read(self):
pass
def write(self):
pass
class Disk: #Disk类也有两个与文件类型同名的方法:read和write
def read(self):
pass
def write(self):
pass
六、总结
1、多态: 一类事物有多种不同的形态,如动物有猫、狗、鸡。
2、多态性: 不管对象是什么数据类型,直接使用各对象统一的方法函数(实现条件:○子类继承父类○子类和父类具有相同的方法函数)。
3、abc模块:定义抽象父类。抽象父类本身不能实例化,而是用来限制子类必须要有的方法函数,否则子类在实例化对象时会报类型错误。
import abc
# 指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化
class Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod # 该装饰器限制子类必须定义有一个名为talk的方法
def talk(self):
pass
4、鸭子类型:不管某物对象是不是真正的鸭子,只要外观(属性)和行为(方法)上看起来像鸭子,那么就认为它就是个鸭子。例如: 定义两个属性和方法都相同的、但没有继承关系的类(具有多态性)。
@声明:“山月润无声”博主知识水平有限,文章如有不妥之处欢迎广大IT爱好者指正,小弟定当虚心受教!