# 鸭子类型

  Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’, Golang也有Duck Type的概念。

#

  封装可以隐藏实现细节,使得代码模块化;

  继承可以扩展已存在的代码模块(类);

  而多态则是为了实现另一个目的 — 接口重用(一个接口多种实现)!

# 实现方法

1、定义函数实现 

class A(object):

    def __init__(self, name):
        self.name = name

    def say(self):    # 有 print 方法
        print("I Love: " + self.name)


class B(object):

    def __init__(self, name):
        self.name = name

    def say(self):  # 有 print 方法
        print("I Love Love Love: " + self.name)


def func(obj):
    obj.say()   # 多态接口,只要对象有say()方法 就是鸭子类型。


if __name__ == '__main__':
    a = A("Python") 
    b = B("Python")

    func(a)
    func(b)

 

2、定义类实现

class A(object):

    def __init__(self, name):
        self.name = name

    def say(self): 
        print("I Love: " + self.name)


class B(object):

    def __init__(self, name):
        self.name = name

    def say(self):
        print("I Love Love Love: " + self.name)


class Func(object):

    def __init__(self, obj):
        self.obj = obj

    def func(self):
        self.obj.say()   # 多态接口,只要对象有say()方法 就是鸭子类型。


if __name__ == '__main__':
    a = A("Python")
    b = B("Python")

    Func(a).func()
    Func(b).func()

 

3、数组实现

class A(object):

    def __init__(self, name):
        self.name = name

    def say(self):
        print("I Love: " + self.name)


class B(object):

    def __init__(self, name):
        self.name = name

    def say(self):
        print("I Love Love Love: " + self.name)


if __name__ == '__main__':
    a = A("Python")
    b = B("Python")

    for obj in [a, b]:
        obj.say()