python之路---面向对象之多态

什么是多态: 一种事物具有多种形态,如水具有液态水,气态水......

多态性: 

 多态性分为动态多态性与静态多态性

       静态多态性:任何数据类型都可以使用运算符+进行运算,而运算的结果是不同的(运算符的意义取决于被操作对象)

     动态多态性:继承一个类的多个子类中拥有相同的方法名,那么这些子类产生的对象就可以不用考虑具体的类型,直接去调用类的功能,精髓是统一,例如:我们经常使用len()这个内置函数(实际上是调用了__len__方法)去得到一个数据类型的长度(我们并不会去考虑被操作的对象到底是什么数据类型,只需要知道它是可迭代的),而不是每个数据类型各使用一种与其对应的方法

例如,我们将人的说话技能和猫叫都定义为speak()函数,那么使用者在使用的过程中根本不需要去考虑人应该调用什么,猫应该调用什么,只需要知道有一个speak()方法,甚至我们可以定义一个接口函数func,不管什么类型的对象进来,只需要他有一个speak方法就可以,这大大降低了使用者的操作难度

class People():
    def speak(self):
        print('say hello')


class Cat():
    def speak(self):
        print('喵喵')


def func(obj):
    obj.speak()

obj1 = People()
obj2 = Cat()
func(obj1)
func(obj2)

如何强制的达到统一的效果?

通过接口

接口提取了一群类的共同函数,可以将接口理解为这些函数的集合,然后我们让子类去实现这些接口内的函数,这样的好处在于
实现了归一化(所有基于一个接口实现的类,这些类实例化的对象在使用时,他们的用法是一致的),
而归一化的好处在于:
1.对象的使用者不必考虑对象的类具体是什么,只要关心对象拥有什么样的功能,极大的降低了使用者的使用难度
2.对于高层的外部使用者可以不区分的处理所有接口兼容的对象集合(例如linux的一切皆文件,所有的东西都可以当作文件去操作,而不必去考虑是硬盘还是内存)
python中并没有定制接口的关键字interface,所以需要用到抽象类

抽象类的概念:

基于类抽象而来的(类是基于对象的抽象而来的),只能被继承,不能被调用(只有抽象方法而没有实现功能),且子类必须实现抽象方法

import abc

class AllFile(metaclass=abc.ABCMeta):
    def read(self):
        pass      #规定子类必须要有read功能

    def write(self):
        pass      #规定子类必须要有write功能

class Txt(AllFile):
    def read(self):
        print('正在读取文本...')
    def write(self):
        print('正在编辑文本...')

class Process(AllFile):
    def read(self):
        print('正在加载进程...')

    def write(self):
        print('正在修改进程...')

txt = Txt()
pro = Process()

txt.read()
pro.read()   #实现了归一化

# 抽象类是介于类与接口之间的,强调数据属性与函数属性的相似
但是python并不支持这么做(大家都是成年人了),python推崇的是鸭子类型,只要你叫的像鸭子并且走路也像鸭子,那么你就是鸭子,python推崇的是约定俗成

猜你喜欢

转载自blog.csdn.net/ltfdsy/article/details/81908286