多态 与 鸭子类型 duck duck duck

# -->

'''

多态 与 鸭子类型

--> 什么是多态
        对象的多种状态,父类对象的多种 (子类对象) 状态


--> 什么是鸭子类型:
        长的像就是
        1.规定有什么属性及什么方法的对象叫鸭子类型
        2.能提供出规定的属性与方法的对象就是鸭子

        函数内有.xxx .yyy方法
        传入的对象也必须要有.xxx .yyy才能运行

'''


# -- ( 多态 ) -------------------------------------------------------------------------------------------


import abc
class People(metaclass=abc.ABCMeta):
    def __init__(self,name):
        self.name = name

    def eat(self):
        print('eat')
    @abc.abstractmethod
    def speak(self):pass


class Chinese(People):
    def speak(self):
        print('说中国话')

class England(People):
    def speak(self):
        print('说英国话')


if __name__ == '__main__':

    # def ask_someone(obj):
    # 多态的体现:功能或是需求,需要父类的对象,可以传入父类对象或任意子类对象
    # 一般都是规定需要父类对象,传入子类对象
    # 有抽象方法的父类不能被实例化 (假设因为被实例化后,就可以调用自己的抽象方法,没有意义)
    def ask_someone(obj):
        print('让%s上台演讲'%obj.name) # 父类提供,子类之间继承
        obj.speak()
        # 父类提供,英国和中国speak内容不同,
        # 调用abc模块装饰父类@abc.abstractmethod子类重写

    ch = Chinese('王大锤')

    # ch实例化,用了Chinses类,用继承的父类People中的自定义name,传入'王大锤'
    en = England('Tom')

    ask_someone(ch)
    # 调用函数ask_someone(obj) 传入ch的实例化 Chinese('王大锤')
    ask_someone(en)

    # England 类有.name .speak
    # ask_someone 方法有.name .speak需求
    # 即可直接传入

# -- ( 鸭子类型 ) -------------------------------------------------------------------------------------------

# 长的差不多的类,都具有一样的功能

猜你喜欢

转载自www.cnblogs.com/max404/p/10753631.html