zoukankan      html  css  js  c++  java
  • python基础第二十一天(多态,抽象类和接口类)

    今日主要内容:

    1.接口类和抽象类

    2.多态和鸭子类型

    一.

    什么是接口类

    接口:

    接口是Java中特有的一种数据形式,一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。接口并不是类,编写接口的方式和类很相似.

    接口类:

    python中接口类继承了Java中接口的定义,用于子类继承父类的接口方法的定义,采用单继承的模式,实现python中的多继承意义.

    所以python中,没有接口的定义,是因为python可以实现多继承.

    接口类的实现:

    from abc import ABCMeta,abstractmethod
    class IStream(metaclass = ABCMeta):
        @abstractmethod
        def read():pass
        @abstractmethod
        def write():pass

    实践中,继承的第一种含义意义并不很大,甚至常常是有害的。因为它使得子类与基类出现强耦合。

    继承的第二种含义非常重要。它又叫“接口继承”。
    接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。

    什么是抽象类:

    抽象类类似于Java中的抽象类规则,并且需要借助abc模块实现.抽象类是一个特殊的类,抽象类只能被继承不能被实例化.

    抽象类被定义的目的:

    由于抽象类不能被实例化,所以创建出来就是为了被继承,所以python中设置抽象类的目的是为了规范方法的定义.即,抽象类内的方法如何定义的,定义的名称是什么,被继承的类都必须按照抽象类内的方法进行设计.

    抽象基类(父类)的主要用途就是在代码中检查某些类是否特点类型,实现了特定接口

     如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类是从一堆中抽取相同的内容而来的,内容包括数据属性和函数属性

    抽象类和接口类总结:

    抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。

    抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计 

    在python中,并没有接口类这种东西,即便不通过专门的模块定义接口,我们也应该有一些基本的概念。

    1.多继承问题

    在继承抽象类的过程中,我们应该尽量避免多继承;
    而在继承接口的时候,我们反而鼓励你来多继承接口

    接口隔离原则:
    使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口。

    2.方法的实现

    在抽象类中,我们可以对一些抽象方法做出基础实现;
    而在接口类中,任何方法都只是一种规范,具体的功能需要子类实现

    多态和鸭子类型

    多态指的是一类事物有多种形态

    什么是多态性:

    多态性是指在不考虑实例类型的情况下使用实例

    复制代码
    在面向对象方法中一般是这样表述多态性:
    向不同的对象发送同一条消息(!!!obj.func():是调用了obj的方法func,又称为向obj发送了一条消息func),不同的对象在接收时会产生不同的行为(即方法)。
    也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。
    
    比如:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生执行的是放学操作,虽然二者消息一样,但是执行的效果不同

    鸭子类型:

    Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’

    python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象

    也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。

    例1:利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的方法

    例2:序列类型有多种形态:字符串,列表,元组,但他们直接没有直接的继承关系

    #二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用
    class TxtFile:
        def read(self):
            pass
    
        def write(self):
            pass
    
    class DiskFile:
        def read(self):
            pass
        def write(self):
            pass

    以上就是今日内容,大部分都是需要记住的概念

  • 相关阅读:
    Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第四部分(Page 9)
    Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第一部分(Page 6)
    Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第二部分(Page 7)
    Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第三部分(Page 8)
    Django 2.0.1 官方文档翻译: 如何安装 django (Page 17)
    Django 2.0.1 官方文档翻译: 文档目录 (Page 1)
    Django 2.0.1 官方文档翻译: 快速安装向导 (Page5)
    如何画流程图
    centos7.x firewall简单使用
    cetos6配置用msmtp和mutt发邮件(阿里云)
  • 原文地址:https://www.cnblogs.com/tom2ling/p/8857927.html
Copyright © 2011-2022 走看看