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.7(类相关函数的补充)
8.python之面相对象part.8(__slots__属性)