8.python之面相对象part.4(接口继承的思想设计,这种东西也叫抽象类)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8.python之面相对象part.4(接口继承的思想设计,这种东西也叫抽象类)相关的知识,希望对你有一定的参考价值。

接口继承也叫做程序的归一化设计,这种东西也有人叫它抽象类。

那么什么又是抽象类呢?

抽象类这种东西,只能被继承,不可以被实例化。

如果说一个类是从一堆对象中抽取出来的,那么一个抽象类,就是从一堆类中抽取出来的。

简单的说,抽象类与普通类最大的不同之处就是,抽象类中的方法都试抽象的,没有办法实现具体的功能,这种抽象类不能生成对象,只可以被继承,但是,继承了这个抽象类的子类,必须去实现抽象类所抽象出来的方法!这个概念很像接口,所以说,我把它理解为接口式的继承。

关于抽象类的定义概念,可以参考下面这个例子。

在实现抽象类定义之前,python给我提供了一个名为“abc”的模块,这个模块可以用来定义抽象类。

2.7版本:

#!/usr/bin/python2.7

# -*- coding:utf-8 -*-

import abc   #导入abc模块,这个模块可以用来定义抽象类和抽象方法。

class Read_and_write_devices:

    __metaclass__ = abc.ABCMeta    #定义这个类为抽象类

    all_type = "rw_divce"

    @abc.abstractmethod      #定义抽象类中的抽象方法

    def read(self):

        pass

    @abc.abstractmethod        #定义抽象类中的抽象方法

    def write(self):

        pass

class Scsi_harddisk(Read_and_write_devices):

    def read(self):

        print "scsi硬盘读方法"

    def write(self):

        print "scsi硬盘写方法"

class Memory_ram(Read_and_write_devices):

    def write(self):

        print "内存的写方法"


3版本:

import abc

class Read_and_write_devices(metaclass=abc.ABCMeta):

    all_type = "rw_divce"

    @abc.abstractmethod

    def read(self):

        pass

    @abc.abstractmethod

    def write(self):

        pass

class Scsi_harddisk(Read_and_write_devices):

    def read(self):

        print "scsi硬盘读方法"

    def write(self):

        print "scsi硬盘写方法"

class Memory_ram(Read_and_write_devices):

    def write(self):

        print "内存的写方法"


在抽象类的方法上加上了 @abc.abstractmethod这个装饰器后这个抽象类中的方法就回变成抽象方法,如果其他类继承了这个抽象类,就必须去实现这个抽象类中所抽象出来的方法!!如果不满足抽象类中定义的抽象方法,那么这个类将无法创建对象!!

我们来看下上面这个例子,首先定义了一个名为Read_and_write_devices可读写设备的类,想想可读写的设备有哪些?硬盘和内存都是可读可写的设备,现在定义一个内存类用于控制内存的读写,一个硬盘类用来控制硬盘的读写,不管是内存和硬盘都必须具有两个方法,分别是read和write, Scsi_harddisk类和Memory_ram一个用来操作内存,另一个用来操作硬盘,这两个类同事继承Read_and_write_devices这个抽象类,其中Scsi_harddisk类满足了抽象类中抽象出来的read和write方法,而Memory_ram这个类只满足了抽象类中抽象出来的write 方法,接下来用这两个类去创建对象,看看会有什么结果。

disk1 = Scsi_harddisk()

disk1.read()

>>>scsi硬盘读方法

Scsi_harddisk这个类可以创建出对象。(这个类实现了抽象类抽象出的read方法和write方法)。

接下来试试看Memory_ram是否可以生成对象。

mem1 = Memory_ram()

结果输出如下:

Traceback (most recent call last):

  File "/Users/macbook/PycharmProjects/untitled1/8day/test.py", line 26, in <module>

    mem1 = Memory_ram()

TypeError: Can‘t instantiate abstract class Memory_ram with abstract methods read

Process finished with exit code 1

在 Memory_ram这个类在实例化对象的过程中出了错误,是因为 Memory_ram这个类没实现Read_and_write_devices这个抽象类中抽象出的两个方法,最终导致了Memory_ram这个类没有办法实例化出对象。


为什么要使用接口继承这种特性?

接口(也就是前面说的那个抽象类)提取了一群类共同的函数,然后让继承了接口类(抽象类)的函数(方法)去实现接口类中的函数。

这么做就是为了实现一种名为“归一化”的思想。

所谓的归一化思想,就是只要是通过同一个接口类(抽象类)实现的类,这些类产生的对象,在使用时,方法都一样。

说的再通俗易懂一点,就是我们不再需要关心这个对象是由哪个类产生的,只要知道这些对象都具备哪些功能就可以了。

比如:我们有一个汽车接口,里面定义了汽车所有的功能,然后由本田汽车的类,奥迪汽车的类,大众汽车的类,他们都实现了汽车接口,这样就好办了,大家只需要学会了怎么开汽车,那么无论是本田,还是奥迪,还是大众我们都会开了,开的时候根本无需关心我开的是哪一类车,操作手法(函数调用)都一样。


本文出自 “reBiRTH” 博客,请务必保留此出处http://suhaozhi.blog.51cto.com/7272298/1912947

以上是关于8.python之面相对象part.4(接口继承的思想设计,这种东西也叫抽象类)的主要内容,如果未能解决你的问题,请参考以下文章

8.python之面相对象part.6(python类中的多态与多态性)

8.python之面相对象part.8(类装饰器)

补8.python之面相对象part.7(类相关函数的补充)

8.python之面相对象part.8(__slots__属性)

8.python之面相对象part.9(初识元类part.1)

8.python之面相对象part.2(特殊属性,类方法,静态方法)