python之鸭子类和多态

0x00 什么是多态

<1>一种类型具有多种类型的能力
<2>允许不同的对象对同一消息做出灵活的反应
<3>以一种通用的方式对待个使用的对象
<4>非动态语言必须通过继承和接口的方式来实现

0x01 python中的多态

<1>通过继承实现多态(子类可以作为父类来使用)
<2>子类通过重载父类的方法实现多态

class Animal:
    def move(self):
        print('animal is moving....')
class Dog(Animal):
    pass
def move(obj):
    obj.move()

>>>move(Animal())
>>>animal is moving....
>>>move(Dog())
>>>animal is moving....

class Fish(Animal):
    def move(self):
        print('fish is moving....')
>>>move(Fish())
>>>fish is moving....

0x02 动态语言和鸭子类型
<1>变量绑定的类型是不确定的
<2>函数和方法可以接收任何类型的参数
<3>调用方法时不检查提供的参数类型
<4>调用是否成功有参数的方法和属性确定,调用不成功则抛出错误
<5>不用实现接口

class P:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __add__(self, oth):
        return P(self.x+oth.x, self.y+oth.y)
    def info(self):
        print(self.x, self.y)
class D(P):
    def __init__(self, x, y, z):
        super.__init__(x, y)
        self.z = z

    def __add__(self, oth):
        return D(self.x+oth.x, self.y+oth.y, self.z+oth.z)
    def info(self):
        print(self.x, self.y, self.z)

class F:
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

    def __add__(self, oth):
        return D(self.x+oth.x, self.y+oth.y, self.z+oth.z)
    
    def info(self):
        print(self.x, self.y, self.z)
    

def add(a, b):
    return a + b

if __name__ == '__main__':
    add(p(1, 2), p(3, 4).info())
    add(D(1, 2, 3), D(1, 2, 3).info())
    add(F(2, 3, 4), D(2, 3, 4).info())

0x04 多态的好处
<1>可实现开放的扩展和修改的封闭
<2>使python程序更加的灵活

posted @ 2017-01-22 22:24  seven95  阅读(225)  评论(1编辑  收藏  举报