面向对象之 —— 多态
多态:一类事物有多种形态
文件有多种形态:文本文件,可执行文件
让几个不同类拥有相同父类,这样一来他们就具备了相同的方法,每个子类要覆盖父类的方法,从而每个类的对象行为都不同。
当使用了多态之后 对象的使用者不需要关系这个对象具体的实现,只需要知道该对象属于哪个基类,就能直接使用它
如此扩展性变高了
使用ABC模块来限制子类 的步骤
1.为类中指定元类为abc.ABCMeta
2.在相应的方法上加上abc.abstractmethod装饰器
优:完全不需要考虑得到的对象时声明类型 只要知道了其基类中的内容就能使用
多态中的基类 相当于(协议 标准 规范) 要求子类必须满足这些标准
多态性:在不考虑实例类型的情况下使用实例
不同对象 可以相应同一方法,并作出不同的行为,产生不同结果
多态性分为静态多态性和动态多态性
静态多态性:如任何类型都可以用运算符+进行运算
动态多态性:不知道怎么描述,放个例子先
peo=People() dog=Dog() pig=Pig() #peo、dog、pig都是动物,只要是动物肯定有talk方法 #于是我们可以不用考虑它们三者的具体是什么类型,而直接使用 peo.talk() dog.talk() pig.talk() #更进一步,我们可以定义一个统一的接口来使用 def func(obj): obj.talk()
优点:增加了程序的灵活性与可扩展性
鸭子类型
Python崇尚“鸭子类型”,鸭子类型即不使用abc模块,也不需要基类,将方法名字都写成一样,同样可以实现多态的方式
利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的方法
#二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用 class TxtFile: def read(self): pass def write(self): pass class DiskFile: def read(self): pass def write(self): pass
Python的序列类型有多种形态:字符串,列表,元组,多态性
#str,list,tuple都是序列类型 s=str('hello') l=list([1,2,3]) t=tuple((4,5,6)) #我们可以在不考虑三者类型的前提下使用s,l,t s.__len__() l.__len__() t.__len__() len(s) len(l) len(t)
Python的序列类型有多种形态:字符串,列表,元组,多态性