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)
    
  • 相关阅读:
    Python(3)---从迭代器到异步IO
    并发访问sqlite数据库出现databse is locked的错误的一个解决办法
    基础概念2
    (已解决)Arduino mega2560 R3插在电脑上没有反应
    <Android 基础(二)> BroadcastReceiver
    unicode字符和多字节字符的相互转换接口
    PHP中XML和数组互相转换的方法
    java网络编程—TCP(1)
    Java EE的十三个技术规范
    <Android 基础(一)> Service
  • 原文地址:https://www.cnblogs.com/Ghostant/p/11951016.html
Copyright © 2011-2022 走看看