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)
    
  • 相关阅读:
    17.1.2.1 Advantages and Disadvantages of Statement-Based and Row-Based Replication
    17.1.2 Replication Formats
    Setting the Master Configuration on the Slave
    17.1.1.9 Introducing Additional Slaves to an Existing Replication Environment
    17.1.1.8 Setting Up Replication with Existing Data
    17.1.1.7 Setting Up Replication with New Master and Slaves
    17.1.1.6 Creating a Data Snapshot Using Raw Data Files
    列出display的值,并说明它们的作用
    CSS设置DIV居中
    CSS选择符有哪些?哪些属性可以继承?优先级算法如何计算?
  • 原文地址:https://www.cnblogs.com/Ghostant/p/11951016.html
Copyright © 2011-2022 走看看