什么是多态
谈到多态肯定是和继承结合在一起的,本质是子类通过覆盖或重载(覆重
)父类的方法,来使得对同一类对象同一方法的调用产生不同的结果。
如:
import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
@abc.abstractmethod
def talk(self):
pass
class People(Animal): #动物的形态之一:人
def talk(self):
print('say hello')
class Dog(Animal): #动物的形态之二:狗
def talk(self):
print('say wangwang')
class Pig(Animal): #动物的形态之三:猪
def talk(self):
print('say aoao')
peo=People()
dog=Dog()
pig=Pig()
#peo、dog、pig都是动物,只要是动物肯定有talk方法
#于是我们可以不用考虑它们三者的具体是什么类型,而直接使用
peo.talk()
dog.talk()
pig.talk()
#更进一步,我们可以定义一个统一的接口来使用
def func(obj):
obj.talk()
func(peo)
func(dog)
func(pig)
class Position:
def __init__(self, name, height):
self.name = name
self.height = height
def distribut(self):
if float(self.height) <= 1.91:
print('%s应该打控卫' % self.name)
if 1.91 < float(self.height) <= 2.01:
print('%s应该打分卫' % self.name)
if 2.01< float(self.height) <= 2.07:
print('%s应该打小前锋' % self.name)
if 2.07 < float(self.height) <= 2.10:
print('%s应该打大前锋' % self.name)
if 2.10< float(self.height):
print('%s应该打中锋' % self.name)
p1 = Position('lebron_james', '2.03')
p2 = Position('kevin_durant', '2.08')
p3 = Position('stphen_curry', '1.91')
p4 = Position('dwyne_wade', '1.93')
p5 = Position('anthony_davis', '2.13')
def pst(player):
return player.distribut()
pst(p1)
pst(p2)
pst(p3)
pst(p4)
pst(p5)
>>>
lebron_james应该打小前锋
kevin_durant应该打大前锋
stphen_curry应该打控卫
dwyne_wade应该打分卫
anthony_davis应该打中锋
多态的好处
1.增加了程序的灵活性
以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)
2.增加了程序额可扩展性
通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用