面向对象之 —— 多态

多态:一类事物有多种形态

文件有多种形态:文本文件,可执行文件

让几个不同类拥有相同父类,这样一来他们就具备了相同的方法,每个子类要覆盖父类的方法,从而每个类的对象行为都不同。

当使用了多态之后 对象的使用者不需要关系这个对象具体的实现,只需要知道该对象属于哪个基类,就能直接使用它
如此扩展性变高了

使用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的序列类型有多种形态:字符串,列表,元组,多态性

 

 

 

posted @ 2019-05-29 16:29  呔!妖精。。。  阅读(97)  评论(0编辑  收藏  举报