Python全栈开发实战学习16

抽象类

接口与归一化设计

1.什么是接口

Java中的Interface接口的特征:
1)是一组功能的集合,而不是一个功能
2)接口的功能用于交互,所有功能都是public,即别的对象可操作
3)接口只定义函数,但不涉及函数实现
4)这些功能是相关的

首先,我们必须明确的一点是:python里无接口类型,定义接口只是一个人为规定,在编程过程自我约束

2.为什么要用接口

接口提取了一群类共同的函数,可以把接口当做一个函数的集合
然后让子类去实现接口中的函数
这么做的意义在于归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都是一样的。

归一化的好处:
1.让使用者无需关心对象的类是什么,只需要知道这些对象具备某些功能就可以了,这极大地降低了使用者的难度。
2.归一化使得高层的外部使用者可以在不加区分的 处理所有接口兼容的对象集合。

通俗来讲就是使用者不用关心其内部的实现原理,只管用就行了。

3.模仿interface

在python中根本没有一个叫interfa的关键字,如果非要去模仿接口的概念,可借助第三方模块:http://pypi.python.org/pypi/zope.interface
也可使用继承,其实继承有两种用途:
一是继承基类的方法,并且做出自己的改变或者扩展
二是声明某个子类兼容于某基类,定义一个接口类,(模仿java的interface),接口类中定义了一些接口名(就是函数名)且并未实现这些接口的功能,子类继承接口类,并且实现接口中的功能。

class Interface:# 定义接口Interface类来模仿接口的概念,python中压根就没有interface关键字来定义一个接口
    def read(self): # 定义接口函数read
        pass
    def write(self): # 定义接口函数write
        pass
    
class Txt(Interface):
    def read(self):
        print("文本数据的读取方式")
    def write(self):
        print("文本数据的读取方式")
class Sata(Interface):
    def read(self):
        print("硬盘数据的读取方式")
    def write(self):
        print("硬盘数据的读取方式")
class Process(Interface):
    def read(self):
        print("进程数据的读取方式")
    def write(self):
        print("进程数据的读取方式")

上面代码只是看起来像接口,其实并没有起到接口的作用,子类完全可以不同去实现接口,这就用到了抽象类

抽象类

1.什么是抽象类

与java一样,python也有抽象类的概念,同样需要借助模块来实现,抽象类是一个特殊的类,她的特殊之处在于只能被继承,不能被实例化。

2.为什么要有抽象类

如果说类是从一堆对象中抽取相同内容而来的,那么抽象类是在一堆类中抽取相同内容而来的,其中包括数据属性和函数属性
比如我们有苹果类,香蕉类,桃子类等等,它们的抽象类就是水果,我们可以吃到一个具体化的苹果类实例,但是无法吃的一个叫做水果的东西。

3.Python中实现抽象类

import abc

class All_file(metaclass=abc.ABCMeta):
    all_type = 'file'
    @abc.abstractclassmethod  # 定义抽象方法,无需实现功能
    def read(self):
        '子类必须定义读功能'
        pass
    @abc.abstractclassmethod # 定义抽象方法,无需实现功能
    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("进程数据的读取方式")


wenbenwenjuan = Txt()
yingpanwenjian = Sata()
jinchengwenjian = Process()

# 这样大家都是被归一化了,也就是一切皆文件的思想
wenbenwenjuan.read()
yingpanwenjian.write()
jinchengwenjian.read()

print(wenbenwenjuan.all_type)
print(yingpanwenjian.all_type)
print(jinchengwenjian.all_type)


=================
结果
文本数据的读取方式
硬盘数据的读取方式
进程数据的读取方式
file
file
file

抽象类与接口

抽象类的本质还是类,指的是一组类的相似性,包裹数据属性和函数属性,而接口只强调函数属性的相似性。
抽象类是一个结余类和接口之间的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值