面向对象的三大特性之----------多态

什么是多态

谈到多态肯定是和继承结合在一起的,本质是子类通过覆盖或重载(覆重)父类的方法,来使得对同一类对象同一方法的调用产生不同的结果。

如:

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)去调用  

猜你喜欢

转载自www.cnblogs.com/cjsword/p/10618121.html