第三十一篇 面向对象的三大特性之多态

什么是多态?

多态的概念指出了对象如何通过他们共同的属性和动作来操作及访问,而不需要考虑他们具体的类。

多态表明了动态(即运行时)绑定的存在,允许重载及运行时类型确定和验证。(多态体现在不同的对象调用共同的方法的时候,才能展现出来)

换句话说,Python的多态是在不同的实例调用同一个类方法,在执行的时候,才体现出来的。

举例:

水是一个类

不同温度,水被实例化成了不同的状态:冰,水蒸气,水,这就是一个多态。水的三种状态。----多态的第一层意思

多态是运行时绑定的

class H2O(object):
    """docstring for H2O"""
    def __init__(self, name, wendu):
        self.name = name
        self.wendu = wendu

    def turn_ice(self):
        if self.wendu < 0:
            print("[%s] 温度太低了结冰了" %self.name)
        elif self.wendu > 0 and self.wendu < 100:
            print("[%s] 液化成水了" %self.name)
        elif self.wendu > 100:
            print("[%s] 温度太高变成了水蒸气" %self.name)

class Water(H2O):
    pass

class Ice(H2O):
    pass

class Qiti(H2O):
    pass

w = Water('',20)
i = Ice('', -25)
q = Qiti('',3000)

# 多态体现在不同的对象调用共同的方法的时候,才能展现出来
# w,i,q是三个不同的对象,都调用了共同的父类方法turn_ice(),而且执行的结果是完全不一样的

w.turn_ice()    # [水] 液化成水了         相当于下面示例的:func(w)
i.turn_ice()    # [冰] 温度太低了结冰了    相当于下面示例的:func(w)
q.turn_ice() # [气] 温度太高变成了水蒸气 相当于下面示例的:func(q)

 下面的示例旨在说明多态的原理,实际中并不这么写,而是采用上面的方式写。

示例:多态的func(w)调用方式

python本身就是多态的,举例如下:

多态是怎么产生的呢?

首先,得有一个基类(H20),基类里还有类方法,而且这个类方法的目的就是为了让子类去用。

其次,不同的子类(Water, Ice, Qiti)继承了基类(H20),也继承了基类的类方法(turn_ice)。----继承是基础

最后,不同的子类实例化出不同的实例(w,i,q),然后不同的实例(w,i,q)调用同一个基类的类方法(turn_ice)。----继承后,子类要调用基类的类方法,调用的目的是使用,只有使用了才能实现多态。如果不调用,就没实现多态的目的。

所以说,继承能实现代码的重用,而且必须有一个机制能把需要重用的代码能用起来,这种体现机制就是多态。

什么时候用多态呢?

其实,已经在有意识无意识的在使用多态了,因为只要有继承,继承的目的就是为了使用类方法,只要你一用,就已经在使用多态性了。

【小结】

类的继承有两层意义:改变 和 扩展

多态就是类的这两层意义的一个具体的实现机制

即,调用不同的类实例化的对象下的相同的方法,实现过程是不一样的。

Python中的标准类型就是多态概念的一个很好的示范。

 

posted @ 2018-07-17 22:31  mamingchen  阅读(249)  评论(0编辑  收藏  举报