zoukankan      html  css  js  c++  java
  • python面向对象(四)之抽象类与接口

    ​ 学过java的应该知道java有抽象类和接口的那么python呢?(以前写的关于java抽象类的笔记java抽象类与接口)

    python作为一个动态语言,没有强类型的检查,而是以鸭子类型的方式提现,在执行的时候python不严格要求你必须是继承指定的父类而来,只要在调用的时候你有相应的方法和属性就可以了,长的像鸭子你就是鸭子。

    也正是基于python这样的特性,python中没有interface的概念,有说interface并不是普遍存在的,而是作为一个特例出现在java中,为的是解决多继承的问题。python支持多继承,自然没有这个需要了。然而我们难免会有这样的需求:子类必须实现某些指定的方法和属性,否则就抛异常。使用一些笨方法自然是可以达到相同的效果,但是python为我们提供了abc(abstract base class)模块。

    抽象类

    什么是抽象类

    目的

      为了对代码更好的维护和重用。
     解析:
      抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

      1.因为抽象类不能实例化对象,所以必须要有子类来实现它之后才能使用。这样就可以把一些具有相同属性和方法的组件进行抽象,这样更有利于代码和程序的维护。
      例子:

      比如本科和研究生可以抽象成学生,他们有相同的属性和方法。这样当你对其中某个类进行修改时会受到父类的限制,这样就会提醒开发人员有些东西不能进行随意修改,这样可以对比较重要的东西进行统一的限制,也算是一种保护,对维护会有很大的帮助。

      2.当又有一个具有相似的组件产生时,只需要实现该抽象类就可以获得该抽象类的那些属性和方法。
      例子:  

      比如学校又新产生了专科生这类学生,那么专科生直接继承学生,然后对自己特有的属性和方法进行补充即可。这样对于代码的重用也是很好的体现。

      所以,Java中抽象类对于代码的维护和重用有很好的帮助,也是Java面向对象的一个重要体现。

    定义

    使用abc(abstract base class)模块实现抽象类

    abc.ABCMeta 这是用来生成抽象基础类的元类。由它生成的类可以被直接继承。
    abc.ABC辅助类,让你可以不用关心元类概念,直接继承它,就有了ABCMeta元类。使用时注意元类冲突
    @abc.abstractmethod 定义抽象方法,除了这个装饰器,其余装饰器都被deprecated了。

    #_*_coding:utf-8_*_
    
    import abc #利用abc模块实现抽象类
    
    class All_file(metaclass=abc.ABCMeta):
        all_type='file'
        @abc.abstractmethod #定义抽象方法,无需实现功能
        def read(self):
            '子类必须定义读功能'
            pass
    
        @abc.abstractmethod #定义抽象方法,无需实现功能
        def write(self):
            '子类必须定义写功能'
            pass
    
    # class Txt(All_file):
    #     pass
    #
    # t1=Txt() #报错,子类没有定义抽象方法
    
    class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法
        def read(self):
            print('文本数据的读取方法')
    
        def write(self):
            print('文本数据的读取方法')
    
    class Sata(All_file): #子类继承抽象类,但是必须定义read和write方法
        def read(self):
            print('硬盘数据的读取方法')
    
        def write(self):
            print('硬盘数据的读取方法')
    
    class Process(All_file): #子类继承抽象类,但是必须定义read和write方法
        def read(self):
            print('进程数据的读取方法')
    
        def write(self):
            print('进程数据的读取方法')
    
    txt_file=Txt()
    
    sata_file=Sata()
    
    process_file=Process()
    
    #这样大家都是被归一化了,也就是一切皆文件的思想
    txt_file.read()
    sata_file.write()
    process_file.read()
    
    print(txt_file.all_type)
    print(sata_file.all_type)
    print(process_file.all_type)
    

    接口

    ​ 接口只是定义了一些方法,而没有去实现,多用于程序设计时,只是设计需要有什么样的功能,但是并没有实现任何功能,这些功能需要被另一个类(B)继承后,由 类B去实现其中的某个功能或全部功能。

    ​ 在python中接口并没有在java那么重要,因为如果要继承接口,需要把其中的每个方法全部实现,否则会报编译错误,还不如直接定义一个class,其中的方法实现全部为pass,让子类重写这些函数。如果想强制子类实现父类的方法,可以会用abc模块强制子类实现,不实现的话就会报错。

    ​ 在此就不举例了,因为实现方法就是如抽象方法一样(抽象类加抽象方法就等于面向对象编程中的接口)。

    抽象类与接口

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

  • 相关阅读:
    推荐一个golang的json库
    TinyMind 多标签图像分类竞赛 之路
    动态环境下的slam问题如何解决?
    ubuntu16.04下安装opencv3.4.1及其扩展模块
    Ubuntu 16.04 编译OpenCV 问题解决stdlib.h: No such file or directory
    linux下升级gcc版本(gcc-7)
    基于LSD的直线提取算法
    PL-SLAM
    用U盘制作并安装WIN10 64位原版系统的详细教程(该方法应该适用于任何一版的原版操作系统)
    Win10正式版U盘安装教程
  • 原文地址:https://www.cnblogs.com/yangliguo/p/8127978.html
Copyright © 2011-2022 走看看