面向对象的多态、多态性
多态
多态指的是一类事物有多种形态,比如水有多种形态:冰、水、水蒸气,但都是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)去调用