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这个类没有办法实例化出对象。


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

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

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

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

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

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





      本文转自苏浩智 51CTO博客,原文链接http://blog.51cto.com/suhaozhi/1912947:,如需转载请自行联系原作者

相关文章
|
29天前
|
SQL API Python
Python DB API下规范下cursor对象常用接口
Python DB API下规范下cursor对象常用接口。
21 4
|
2天前
|
C++ Python
Python中的类与对象
Python中的类与对象
6 1
|
4天前
|
监控 PHP Python
1688快速获取整店铺列表 采集接口php Python
在电子商务的浪潮中,1688平台作为中国领先的批发交易平台,为广大商家提供了一个展示和销售商品的广阔舞台;然而,要在众多店铺中脱颖而出,快速获取商品列表并进行有效营销是关键。
|
15天前
|
缓存 Java Python
Python 弱引用全解析:深入探讨对象引用机制!
Python 弱引用全解析:深入探讨对象引用机制!
21 3
|
17天前
|
运维 Shell Sentinel
第八章 Python可迭代对象、迭代器和生成器
第八章 Python可迭代对象、迭代器和生成器
|
17天前
|
Python
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
|
18天前
|
设计模式 算法 程序员
Python从入门到精通:2.1.3深入学习面向对象编程——设计模式的学习与实践
Python从入门到精通:2.1.3深入学习面向对象编程——设计模式的学习与实践
|
18天前
|
数据安全/隐私保护 Python
Python从入门到精通——2.2.1深入学习面向对象编程:类和对象的定义
Python从入门到精通——2.2.1深入学习面向对象编程:类和对象的定义
|
25天前
|
数据库 Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(下)
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)
49 0
|
25天前
|
Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
60 0