zoukankan      html  css  js  c++  java
  • 面向对象的多态、多态性

    多态

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

          

          

  • 相关阅读:
    人生顿悟之博观而约取,厚积而薄发
    Android_Dialog介绍
    java算法:分治法
    软件开发高手须掌握的4大SQL精髓语句(综合篇)
    和菜鸟一起学linux总线驱动之smartcard传输协议
    和菜鸟一起学linux总线驱动之smartcard操作模式和协议与参数选择
    祝贺自己CSDN博客上的博文《软件开发高手须掌握的4大SQL精髓语句(一)》浏览量突破1000次
    《Android系统源代码情景分析》一书勘误
    java算法:递归算法
    html网马通用免杀
  • 原文地址:https://www.cnblogs.com/pengfy/p/10608681.html
Copyright © 2011-2022 走看看