zoukankan      html  css  js  c++  java
  • 多态及多态性和鸭子类型

    多态及多态性

    啥是多态?

    指的是同一类/种事物的不同形态(其实就是继承关系的表现)

    多态只是一种格式形态,它的主要体现是多态性,理解多态性的含义,就明白了多态。

    把多态比喻为人的顽固,多态性就相当于人的顽固性。

    那多态性在类中的表现形式是怎样的呢?

    class Animal():
    def run(self):
    print('run fast')

    class mouse(Animal):
    def sound(self):
    print('5555')

    obj=mouse() #你看,这里是在mouse类中进行了实例化,但下面的obj调用的run()在mouse类中并不存在
             #我们自然而然就会想到mouse继承了Animal,所以obj会跑到Animal类中去找run()这个函数
             #为什么程序会通过.run()自己自动跑到父类里面去找,这就是多态提供的。
    obj.run()

    多态性:在多态的背景下,可以在不用考虑对象具体类型(也就是不管是子类还是父类中存在这种方法)的前提下而直接使用对象

    多态性的精髓:统一(统一方法。继承关系下,子类方便调用父类中的方法)

    当然,导入abc模块,能够让子类强制执行父类的功能(也就是子类自己有该方法,但只要父类中也有,子类就必须用父类的。有点不讲道理,所以用的比较少)

    import abc #abstract class
    class Animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def eat(self):
    pass
    
    @abc.abstractmethod
    def drink(self):
    pass
    
    @abc.abstractmethod
    def run(self):
    pass
    
    @abc.abstractmethod
    def bark(self):
    pass
    
    # obj=Animal() # 抽象基类本身不能被实例化
    
    class Cat(Animal):
    def eat(self):
    print('cat eat')
    
    def drink(self):
    print('cat drink')
    
    def run(self):
    print('cat run')
    
    def bark(self):
    print('喵喵喵')
    
    c=Cat()
    View Code

    扩展(Python统一思想----一切皆对象,Linux统一思想----一切皆文件)

    鸭子类型

    python是比较崇尚鸭子类型的,目的也是也是和多态一样,为了统一。只不过鸭子类型统一代码的格式。

    例子一(这是非常经典的一个例子):

    class Duck():
      def walk(self):
        print('I walk like a duck')
      def swim(self):
        print('i swim like a duck')
    
    class Person():
      def walk(self):
        print('this one walk like a duck') 
      def swim(self):
        print('this man swim like a duck')
    View Code

    例子二:

    class Disk:
    
        def read(self):
    
            print('Disk read')
    
     
    
        def write(self):
    
            print('Disk write')
    
     
    
    class Memory:
    
        def read(self):
    
            print('Mem read')
    
     
    
        def write(self):
    
            print('Mem write')
    
     
    
    class Cpu:
    
        def read(self):
    
            print('Cpu read')
    
     
    
        def write(self):
    
            print('Cpu write')
    
     
    
    obj1=Disk()
    
    obj2=Memory()
    
    obj3=Cpu()
    
     
    
    obj1.read()
    
    obj2.read()
    
    obj3.read()
    View Code
  • 相关阅读:
    使用JQuery从客户端调用C#方法
    上传文件插件 Uploadify使用说明 转
    juqery 操作select
    XP下安装IIS6.0的办法 转
    更改2003远程桌面端口3389为其他端口号
    Web打印
    远程桌面 客户端无法建立跟远程计算机的连接 解决办法
    WPF的“.NET研究”消息机制(一) 让应用程序动起来 狼人:
    应用Visual Studio 2010辅“.NET研究”助敏捷测试(上) 狼人:
    ASP.NET调用.sql文件(二“.NET研究”) 狼人:
  • 原文地址:https://www.cnblogs.com/SlookUp/p/10750785.html
Copyright © 2011-2022 走看看