老生常谈python之鸭子类和多态
一、什么是多态
<1>一种类型具有多种类型的能力
<2>允许不同的对象对同一消息做出灵活的反应
<3>以一种通用的方式对待个使用的对象
<4>非动态语言必须通过继承和接口的方式来实现
二、python中的多态
<1>通过继承实现多态(子类可以作为父类来使用) <2>子类通过重载父类的方法实现多态 classAnimal: defmove(self): print('animalismoving....') classDog(Animal): pass defmove(obj): obj.move() >>>move(Animal()) >>>animalismoving.... >>>move(Dog()) >>>animalismoving.... classFish(Animal): defmove(self): print('fishismoving....') >>>move(Fish()) >>>fishismoving....
三、动态语言和鸭子类型
<1>变量绑定的类型是不确定的
<2>函数和方法可以接收任何类型的参数
<3>调用方法时不检查提供的参数类型
<4>调用是否成功有参数的方法和属性确定,调用不成功则抛出错误
<5>不用实现接口
classP: def__init__(self,x,y): self.x=x self.y=y def__add__(self,oth): returnP(self.x+oth.x,self.y+oth.y) definfo(self): print(self.x,self.y) classD(P): def__init__(self,x,y,z): super.__init__(x,y) self.z=z def__add__(self,oth): returnD(self.x+oth.x,self.y+oth.y,self.z+oth.z) definfo(self): print(self.x,self.y,self.z) classF: def__init__(self,x,y,z): self.x=x self.y=y self.z=z def__add__(self,oth): returnD(self.x+oth.x,self.y+oth.y,self.z+oth.z) definfo(self): print(self.x,self.y,self.z) defadd(a,b): returna+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())
四、多态的好处
<1>可实现开放的扩展和修改的封闭
<2>使python程序更加的灵活
以上这篇老生常谈python之鸭子类和多态就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。