zoukankan      html  css  js  c++  java
  • python之面向对象编程之多态与多态性

    1.什么是多态

        多态指的是同一种事物的多种形态

        水-》冰、水蒸气、液态水

        动物-》人、狗、猪

    2.为啥要用多态

        多态性:

        继承同一个类的多个子类中有相同的方法名

        那么子类产生的对象就可以不用考虑具体的类型而直接调用功能

        多态性的优点:

        1.增加了程序的灵活性

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

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

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

    # Animal() #强调:父类是用来指定标准的,不能被实例化      
    #父类有的子类必须要有,而且还要同名
    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')

    文件有多种形态:文本文件,可执行文件

    import abc
    class File(metaclass=abc.ABCMeta): #同一类事物:文件
        @abc.abstractmethod
        def click(self):
            pass
    
    class Text(File): #文件的形态之一:文本文件
        def click(self):
            print('open file')
    
    class ExeFile(File): #文件的形态之二:可执行文件
        def click(self):
          print('execute file')
    peo=People()
    dog=Dog()
    pig=Pig()
    
    #peo、dog、pig都是动物,只要是动物肯定有talk方法
    #于是我们可以不用考虑它们三者的具体是什么类型,而直接使用
    peo.talk()
    dog.talk()
    pig.talk()
    
    #更进一步,我们可以定义一个统一的接口来使用
    def func(obj):
        obj.talk()

    3.鸭子类型

        python推崇的是鸭子类型,只要你叫的声音像鸭子,并且你走路的样子也像鸭子,那你就是鸭子

      例:其实大家一直在享受着多态性带来的好处,比如Python的序列类型有多种形态:字符串,列表,元组,多态性体现如下 

     l=[1,2,3]
    # s='helllo'
    # t=(1,2,3)
    #
    # print(l.__len__())
    # print(s.__len__())
    # print(t.__len__())
    #
    # # def len(obj):
    # #     return obj.__len__()
    #
    # print(len(l)) # l.__len__()
    # print(len(s)) #s.__len__()
    # print(len(t))

    例2:利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的方法

    #二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用
    class TxtFile:
        def read(self):
            pass
    
        def write(self):
            pass
    
    class DiskFile:
        def read(self):
            pass
        def write(self):
            pass




     

  • 相关阅读:
    Linux 策略路由配置
    nmcli 使用记录---fatt
    wii 入门之路--fatt
    【转载】Eclipse智能提示及快捷键
    Sqlserver Sequence操作
    Git学习(二)(2015年11月18日)(2016年1月29日)
    Git学习(一)(2015年11月12日)
    【转载】.NET 开发者必备的工具箱
    SQLSERVER 游标
    sqlserver添加查询 表、字段注释(转)
  • 原文地址:https://www.cnblogs.com/Marcki/p/10111943.html
Copyright © 2011-2022 走看看