• python之多态、抽象类、鸭子类型


    '''
    1.什么是多态?
        多态指的是同一类型的事物,不同的表现形式。
    
    2.多态的目的:
        多态 也称为多态性,目的是为了在不知道对象的具体类型的情况下,同一调用属性或方法的规范。
        继承是实现多态的方法之一。
            - 先抽象,再继承
    
        父类:定制一套统一的规范
        子类:遵循父类统一的规范。
        注意:再python中不会强制限制子类必须遵循父类的规范。(要引入抽象类)
    
    '''
    
    class Animal:
        def eat(self):
            pass
    
        def bark(self):
            pass
    
    
    class Tiger(Animal):
        def eat(self):
            print(self.__class__.__name__, 'is eating something')
    
        def bark(self):
            print(self.__class__.__name__, 'is barking...')
    
    
    class Cat(Animal):
        def eat(self):
            print(self.__class__.__name__, 'is eating something')
    
        def bark(self):
            print(self.__class__.__name__, 'is barking...')
    
    
    class Lion(Animal):
        def eat(self):
            print(self.__class__.__name__, 'is eating something')
    
        def bark(self):
            print(self.__class__.__name__, 'is barking...')
    
    
    animal1 = Tiger()
    animal2 = Cat()
    animal3 = Lion()
    animal1.eat()
    animal2.eat()
    animal3.eat()
    
    
    '''
    抽象类
        python内置模块abc模块中,有一个抽象类的装饰器
        - 在父类的方法中,被@abc.abstractmethod装饰的方法,在子类中必须重写,否则会报错.
    
    注意:python中不推荐使用抽象类
    '''
    
    import abc
    
    class Animal(metaclass=abc.ABCMeta):
    
        @abc.abstractmethod
        def eat(self):
            pass
    
        def bark(self):
            pass
    
    
    class Dog(Animal):
        def eat(self):
            pass
    
        def bark(self):
            pass
    
    animal1 = Dog()
    # 在本例中,Dog类必须重写eat()方法eat(可以有参数,也可无参数)
    # 也就是说必须有eat这个函数名
    
    '''
    1.什么是鸭子类型?
        不同的对象,只要长得像鸭子,叫声像鸭子,那么就可以当作是鸭子.
    
        鸭子类型是多态的表现形式之一.
    
    2.为什么要有鸭子类型?
        不同对象,先抽象出相同类型的方法,给他们定制一套统一的规范.
        所有的类,在定义时都按照统一的规范编写.
        如python中内置的类.str list tuple等都是鸭子类型.
        多态的三种表现形式:
            - 继承父类
            - 继承抽象类
            - 鸭子类型:耦合度低,程序的可扩展性强
    
        注意:在python中,强烈推荐使用鸭子类型
    '''
    
    # 满足鸭子类型的类可使用共同的方法
    str1 = 'abc'
    list1 = ['a', 'b', 'c']
    tuple1 = (1, 2, 3, 4)
    str1.__len__()
    list1.__len__()
    tuple1.__len__()
    len(str1)
    len(list1)
    len(tuple1)
    
    class Tiger:
        def eat(self):
            print(self.__class__.__name__, 'is eating something')
    
        def bark(self):
            print(self.__class__.__name__, 'is barking...')
    
    
    class Cat:
        def eat(self):
            print(self.__class__.__name__, 'is eating something')
    
        def bark(self):
            print(self.__class__.__name__, 'is barking...')
    
    
    class Lion:
        def eat(self):
            print(self.__class__.__name__, 'is eating something')
    
        def bark(self):
            print(self.__class__.__name__, 'is barking...')
    
    
    animal1 = Lion()
    animal2 = Lion()
    animal3 = Lion()
    
    
    # 传入的对象中,只要实现了eat()方法就可以调用.
    def EAT(Animal):
        Animal.eat()
    
    
    EAT(animal1)
    
  • 相关阅读:
    ajax技术
    JSDOM获取子节点的一些方法
    防止a标签跳转的几种方法
    关于childNodes和children
    三种预览图片的方法
    异步加载js文件的方法
    跨域访问的解决方案
    关于在JS中设置标签属性
    Eclipse导入web项目发布项目时报Tomcat version 7.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 and 6 Web错误解决方案
    Maven构建项目报No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 问题的解决方案
  • 原文地址:https://www.cnblogs.com/Ghostant/p/11951016.html
Copyright © 2020-2023  润新知