本文为了说明例子,用中文写在了class里面,一般编程最好不要那么写
所谓多态
,就是同一种事物的多种形态
比如
class 载具:
pass
class 坦克(载具):
pass
class 装甲车(载具):
pass
class 武直(载具):
pass
多态的作用
可以在不考虑对象具体类型的情况下而直接使用对象
class 载具: # 统一所有子类的方法
def 移动(self):
print('载具开始移动',end=' ')
class 坦克(载具):
def 移动(self):
super().移动()
print('履带机动')
class 装甲车(载具):
def 移动(self):
super().移动()
print('轮式机动')
class 武直(载具):
def 移动(self):
super().移动()
print('飞行机动')
print(坦克(),装甲车(),武直())
print('='*100)
效果
class 载具: # 统一所有子类的方法
def 移动(self):
print('载具开始移动',end=' ')
class 坦克(载具):
def 移动(self):
super().移动()
print('履带机动')
class 装甲车(载具):
def 移动(self):
super().移动()
print('轮式机动')
class 武直(载具):
def 移动(self):
super().移动()
print('飞行机动')
#定义
objA=坦克()
objB=装甲车()
objC=武直()
#调用
objA.移动()
objB.移动()
objC.移动()
效果
定义统一的接口
class 载具: # 统一所有子类的方法
def 移动(self):
print('载具开始移动',end=' ')
class 坦克(载具):
def 移动(self):
super().移动()
print('履带机动')
class 装甲车(载具):
def 移动(self):
super().移动()
print('轮式机动')
class 武直(载具):
def 移动(self):
super().移动()
print('飞行机动')
##定义
objA=坦克()
objB=装甲车()
objC=武直()
#定义统一的接口
def 载具移动(载具):
载具.移动()
载具移动(objA)
载具移动(objB)
载具移动(objC)
效果
统一所有子类的标准
import abc
class 载具(metaclass=abc.ABCMeta): # 统一所有子类的标准
@abc.abstractmethod
def 移动(self):
print('载具开始移动',end=' ')
class 坦克(载具):
def 移动(self):
super().移动()
print('履带机动')
class 装甲车(载具):
def 移动(self):
super().移动()
print('轮式机动')
class 武直(载具):
def 移动(self):
super().移动()
print('飞行机动')
##定义
objA=坦克()
objB=装甲车()
objC=武直()
#定义统一的接口
def 载具移动(载具):
载具.移动()
载具移动(objA)
载具移动(objB)
载具移动(objC)
效果与前面一致,不过区别在于不能直接在class下写pass,必须要有一个父类的功能(比如这里的移动),哪怕这个移动本身没有功能,比如:
import abc
class 载具(metaclass=abc.ABCMeta): # 统一所有子类的标准
@abc.abstractmethod
def 移动(self):
print('载具开始移动',end=' ')
class 坦克(载具):
def 移动(self):
pass
class 装甲车(载具):
def 移动(self):
pass
class 武直(载具):
def 移动(self):
pass
##定义
objA=坦克()
objB=装甲车()
objC=武直()
#定义统一的接口
def 载具移动(载具):
载具.移动()
载具移动(objA)
载具移动(objB)
载具移动(objC)
不然会报错