zoukankan      html  css  js  c++  java
  • 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)
    
  • 相关阅读:
    Linux系统安装IonCube的方法详解教程
    CentOS7 安装 odoo10
    关于WPF的弹出窗口
    WPF命令使用
    WPF访问UserControl的自定义属性和事件
    一步步实现 Prism + MEF(二)--- 绑定命令
    一步步实现 Prism + MEF(一)--- 搭建框架
    MVVM里绑定TreeView控件的SelectedItem
    MAF框架的使用限制
    排序--归并排序算法
  • 原文地址:https://www.cnblogs.com/Ghostant/p/11951016.html
Copyright © 2011-2022 走看看