• 007---多态与多态性


    多态与多态性

    多态

    • 多态:一种事物的多种形态,比如:动物有多种形态,人、狗、猫。
    import abc
    
    
    class Animal(metaclass=abc.ABCMeta):  # 同一类事物:动物
        @abc.abstractmethod
        def run(self):
            pass
    
        @abc.abstractmethod
        def eat(self):
            pass
    
    
    class Person(Animal):                 # 动物形态之一:人
        def run(self):
            print('在走')
    
        def eat(self):
            print('人吃饭')
    
    
    class Pig(Animal):                    # 动物形态之一:猪
        def run(self):
            print('在跑')
    
        def eat(self):
            print('猪吃草')
    
    
    class Dog(Animal):                    # 动物形态之一:狗
        def run(self):
            print('在跳')
    
        def eat(self):
            print('小狗吃肉')
    
    
    class Cat(Animal):                    # 动物形态之一:猫
        def run(self):
            pass
    
        def eat(self):
            pass
    
    

    多态性

    • python本身就是支持多态性的。不考虑实例对象的类型,比如说python的 + ,字符串能相加。数字能相加,列表能相加。但是他们是不同的对象;还有len()。字符串有长度。列表有。元祖有,字典等都有。
    • 静态多态性、动态多态性。
    • 不管对象是什么类型。只要他实现了某个方法就行。
    import abc
    
    
    class Animal(metaclass=abc.ABCMeta):
        @abc.abstractmethod
        def run(self):
            pass
    
        @abc.abstractmethod
        def eat(self):
            pass
    
    
    class Person(Animal):
        def run(self):
            print('在走')
    
        def eat(self):
            print('人吃饭')
    
    
    class Pig(Animal):
        def run(self):
            print('在跑')
    
        def eat(self):
            print('猪吃草')
    
    
    class Dog(Animal):
        def run(self):
            print('在跳')
    
        def eat(self):
            print('小狗吃肉')
    
    
    class Cat(Animal):
        def run(self):
            pass
    
        def eat(self):
            pass
    class Phone:
        def eat(self):
            print('我是手机对象,吃不得')
    
    person1 = Person()
    pig1 = Pig()
    dog1 = Dog()
    p = Phone()
    
    # 统一的接口
    def func(animal):
        animal.eat()
    
    
    func(person1)
    func(pig1)
    func(dog1)
    func(p)
    '''
    人吃饭
    猪吃草
    小狗吃肉
    我是手机对象,吃不得
    '''
    
    • 对于animal来说。它是func的一个参数,而却代表着多种形态,动物。人。猫。狗。手机。
    • 为什么要使用多态性?
      • 增加量程序的灵活性。以不变应万变,不论对象千变万变,使用者都是通过接口func(animal)去调用
      • 增加量程序的可扩展性。新建的类Phone。只要他下面有eat方法,使用者可以完全不修改自己的代码,和动物类一样调用eat()方法。

    鸭子类型

    • 如果看起来像鸭子,走起来像鸭子,叫起来像鸭子,那它就是鸭子。
    • 序列类型有多种形态:字符串,列表,元组,但他们直接没有直接的继承关系
    # 序列类型:列表list  元祖tuple  字符串str
    
    l = list([1,2,3])
    t = tuple(('a','b'))
    s = str('hello python')
    
    def len(obj):
        return obj.__len__()
    
    print(len(l))
    print(len(t))
    print(len(s))
    
  • 相关阅读:
    Knockout.Js官网学习(visible绑定)
    Entity Framework 简单增删改操作
    Knockout.Js官网学习(数组observable)
    Knockout.Js官网学习(监控属性Observables)
    Entity Framework 简单查询
    Java 使用getClass().getResourceAsStream()方法获取资源
    Virtualbox [The headers for the current running kernel were not found] (操作过程后还是失败,显示相同问题)
    为什么要在linux命令前加上 ./
    Redis need tcl 8.5 or newer
    JDK和Tomcat部署时,版本不同的问题解决
  • 原文地址:https://www.cnblogs.com/xjmlove/p/10321295.html
Copyright © 2020-2023  润新知