面向对象的多态、多态性

多态

       多态指的是一类事物有多种形态,比如水有多种形态:冰、水、水蒸气,但都是H2O,下面定义一个H2O的父类和三种形态的子类:

class H2O:
    def __init__(self,name,temperature):
        self.name = name
        self.temperature = temperature

    def turn(self):
        if self.temperature <= 0:
            print('温度太低,变成%s了'%self.name)
        elif self.temperature >0 and self.temperature <100:
            print('温度适中,变成%s了'%self.name)
        else:
            print('温度太高变成%s了'%self.name)

class Ice(H2O):
    pass

class Water(H2O):
    pass

class Air(H2O):
    pass

多态性

        多态性就是在不考虑实例类型的情况下使用实例,举个例子,我们之前学过的一个内置函数len(),可以用于字符串,也可以用于列表和元组:

s=str('cjeowjo')
l=list([1,2,3])
t=tuple((4,5,6))

#我们可以在不考虑三者类型的前提下使用s,l,t
s.__len__()
l.__len__()
t.__len__()

#其实我们都是这样用的
len(s)
len(l)
len(t)

       其实字符串、列表和元组,是三个子类,他们有共同的父类type,实例化之后都可以调用父类的__len__()这个属性,但是定义一个len()函数后,使用就更灵活了。现在回到之前水的例子:

class H2O:
    def __init__(self,name,temperature):
        self.name = name
        self.temperature = temperature

    def turn(self):
        if self.temperature <= 0:
            print('温度太低,变成%s了'%self.name)
        elif self.temperature >0 and self.temperature <100:
            print('温度适中,变成%s了'%self.name)
        else:
            print('温度太高变成%s了'%self.name)

class Ice(H2O):
    pass

class Water(H2O):
    pass

class Air(H2O):
    pass

i1 = Ice('',-10)
w2 = Water('',20)
a1 = Air('水蒸气',120)

i1.turn()
w2.turn()
a1.turn()
>>>温度太低,变成冰了
>>>温度适中,变成水了
>>>温度太高变成水蒸气了

def func(obj):
    obj.turn()

func(i1)
func(w2)
func(a1)

>>>温度太低,变成冰了
>>>温度适中,变成水了
>>>温度太高变成水蒸气了

       结果是一样的,这个时候再多一种水的其他类,也可以直接用func函数了(当然,目前水就这三种形态,只是假设),可见多态的好处在于:

1.增加了程序的灵活性

  以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(obj)

2.增加了程序额可扩展性

  通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(obj)去调用 

 

      

      

posted @ 2019-03-27 16:47  彭方炎QAQ  阅读(580)  评论(0编辑  收藏  举报