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

风格不统一 提交于 2019-12-05 23:45:38
'''
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)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!