[ python ] 接口类和抽象类
接口类
继承有两种用途:
1. 继承基类的方法,并且做出自己的改变或者扩展(代码重用)
2. 申明某个子类兼容于某基类,定义一个接口类interface,接口类定义了一些接口名且未实现接口的功能,子类继承接口类,并且实现接口中的功能
class Wechat:
'''
微信支付
'''
def pay(self, money):
print('已经用微信支付%s元.' % money) class Alipay:
'''
支付宝支付
'''
def pay(self, money):
print('已经用支付宝支付%s元.' % money) def pay(pay_obj, money):
'''
支付函数,总体负责支付
对应支付的对象和要支付的金额
'''
pay_obj.pay(money) ali = Alipay()
pay(ali, 200)
如果我们又定义了一个支付类且没有定义pay方法:
class Wechat:
'''
微信支付
'''
def pay(self, money):
print('已经用微信支付%s元.' % money) class Alipay:
'''
支付宝支付
'''
def pay(self, money):
print('已经用支付宝支付%s元.' % money) class Applepay:
def fuqian(self, money):
print('已经用Applepay支付%s元.' % money) def pay(pay_obj, money):
'''
支付函数,总体负责支付
对应支付的对象和要支付的金额
'''
pay_obj.pay(money) # 因为 Applepay 类中未定义 pay 方法 ali = Alipay()
pay(ali, 200) apple = Applepay()
pay(apple, 300) # 报错
通过上面的例子,报错是因为 Applepay 类中没有定义 pay 方法。在这里我们可以通过继承的关系来手动抛出异常。
class Payment: # 创建一个基类
def pay(self, money): # 基类中包含 pay 方法
raise NotImplemented # 主动抛出异常 class Wechat(Payment):
'''
微信支付
'''
def pay(self, money):
print('已经用微信支付%s元.' % money) class Alipay(Payment):
'''
支付宝支付
'''
def pay(self, money):
print('已经用支付宝支付%s元.' % money) class Applepay(Payment):
def fuqian(self, money):
print('已经用Applepay支付%s元.' % money) def pay(pay_obj, money):
'''
支付函数,总体负责支付
对应支付的对象和要支付的金额
'''
pay_obj.pay(money) ali = Alipay()
pay(ali, 200) apple = Applepay()
pay(apple, 300) # 报错
已知 Applepay 类中没有 pay 方法,则会去基类中寻找,基类中定义的 pay 方法是主动抛出异常。
可以使用 abc 模块来实现接口,自动的去检查是否实现了某方法
from abc import ABC, abstractclassmethod, ABCMeta
class Payment(metaclass=ABCMeta):
@abstractclassmethod
def pay(self, money):
raise NotImplemented class Wechat(Payment):
'''
微信支付
'''
def pay(self, money):
print('已经用微信支付%s元.' % money) class Alipay(Payment):
'''
支付宝支付
'''
def pay(self, money):
print('已经用支付宝支付%s元.' % money) class Applepay(Payment):
def fuqian(self, money):
print('已经用Applepay支付%s元.' % money) def pay(pay_obj, money):
'''
支付函数,总体负责支付
对应支付的对象和要支付的金额
'''
pay_obj.pay(money) ali = Alipay()
pay(ali, 200) apple = Applepay() # 实例化就能检查出子类是否创建了 pay 方法
实践中,单纯的从子类继承父类的意义不大,甚至有害,因为它使得子类与基类出现强耦合。
继承的第二种含义就非常重要,它又叫‘接口继承’
接口继承实质上是要求‘做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理,实现了特定接口的所有对象’ -- 这在程序设计上,叫做归一化。
归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合。
抽象类
什么是抽象类:
与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化。
为什么要有抽象类:
如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。
比如我们有香蕉的类,有苹果的类,有桃子的类,从这些类抽取相同的内容就是水果这个抽象的类,你吃水果时,
要么是吃一个具体的香蕉,要么是吃一个具体的桃子。。。。。。你永远无法吃到一个叫做水果的东西。
从设计角度去看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的。
从设计角度去看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的。
从实现角度来看,抽象类与普通类的不同之处在于:抽象类中有抽象方法,该类不能被实例化,只能被继承,且子类必须实现抽象方法。
这一点与接口有点类似,但其实是不同的,即将揭晓答案
#一切皆文件
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('进程数据的读取方法') wenbenwenjian=Txt() yingpanwenjian=Sata() jinchengwenjian=Process() #这样大家都是被归一化了,也就是一切皆文件的思想
wenbenwenjian.read()
yingpanwenjian.write()
jinchengwenjian.read() print(wenbenwenjian.all_type)
print(yingpanwenjian.all_type)
print(jinchengwenjian.all_type)
抽象类与接口类
抽象类的本质还是类,指的是一组类的相似性包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。
抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计
在python中,并没有接口类这种东西,即便不通过专门的模块定义接口,我们也应该有一些基本的概念。
[ python ] 接口类和抽象类的更多相关文章
- Python——接口类、抽象类
建立一个接口类.抽象类的规范 from abc import abstractmethod,ABCMeta class Payment(metaclass=ABCMeta): # 元类 默认的元类 t ...
- Python 接口类或抽象类 反射
# 抽象类或者接口类,制定规范,统一方法名 # # 抽象类或者接口类,制定规范,统一方法名 from abc import ABCMeta,abstractmethod class Payrole(m ...
- python学习之老男孩python全栈第九期_day025知识点总结——接口类、抽象类、多态、封装
一. 接口类 java:面向对象编程 设计模式 -- 接口类 接口类:python原生不支持 抽象类:python 原生支持的 from abc import abstractclassmethod, ...
- Python面向对象之接口类(抽象类)
Python面向对象之接口类(抽象类):就是制定一个规范. 比如定义了一个接口类(抽象类)(他们是不可以进行实例化的,这就是他为什么是制定一个规范的原因). 他的定义是需要abc模块,要变的就是他的方 ...
- Python学习日记(二十五) 接口类、抽象类、多态
接口类 继承有两种用途:继承基类的方法,并且做出自己的改变或扩展(代码重用)和声明某个子类兼容于某基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子 ...
- day 25-1 接口类、抽象类、多态
# 接口类:python 原生不支持# 抽象类:python 原生支持的 接口类 首先我们来看一个支付接口的简单例子 from abc import abstractmethod,ABCMeta #我 ...
- day25:接口类和抽象类
1,接口类和抽象类知识背景:一开始在程序界是没有这些概念的,后来就流行了一种语言叫做JAVA,JAVA是一种典型的纯面向对象的语言,JAVA写的程序都是非常适用于更庞大的项目,很多程序员就总结出了一些 ...
- 资料整理:python接口类
1开发原则(七大原则) 一:开放封闭原则 二:接口隔离原则(将不同接口对象一一展现出来,分别调用各自的接口,完成各自的功能) 三:依赖倒置原则 高级模块不能依赖低级模块,可以依赖抽象 规范的定义: 高 ...
- python编程设计模式之接口类和抽象类
接口类 """ 接口类 是一种编程设计模式,在python原本没有接口类 借用Java思想创建的一种规范设计模式 支持多继承,进行多方面规范 ""&q ...
随机推荐
- python中括号的使用
1. 列表list是用[ ]包住的以逗号分隔的数据集合 所有对列表的解析均采用[ ],不论是元素引用或取值 [ ]表示空列表 2. 字典由键-值(key-value)对构成,一般可采用{ }表示 取字 ...
- 【刷题】BZOJ 2754 [SCOI2012]喵星球上的点名
Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串来点 ...
- HSTS的来龙去脉
前言 安全经常说“云.管.端”,“管”指的是管道,传输过程中的安全.为了确保信息在网络传输层的安全,现在很多网站都开启了HTTPS,也就是HTTP+TLS,在传输过程中对信息进行加密.HTTPS使用了 ...
- Jenkins远程代码执行漏洞检查(CVE-2017-1000353)
Jenkins的反序列化漏洞,攻击者使用该漏洞可以在被攻击服务器执行任意代码,漏洞利用不需要任何的权限 漏洞影响范围: 所有Jenkins主版本均受到影响(包括<=2.56版本)所有Jenkin ...
- POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)
POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...
- mysql三-6:完整性约束
一 介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性 主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KE ...
- 【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑
http://blog.csdn.net/poem_qianmo/article/details/26977557 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...
- 对于redis框架的理解(四)
上一篇讲述了eventloop的结构和创建,添加文件事件删除文件事件,派发等等. 而eventloop主要就是调用不同网络模型完成事件监听和派发的. 这一篇主要讲述epoll网络模型,redis是如何 ...
- 手脱PEncrypt 4.0
1.载入PEID PEncrypt 4.0 Gamma / 4.0 Phi -> junkcode [Overlay] 2.载入OD,没什么头绪,忽略所有异常,用最后一次异常法shift+F9运 ...
- 为Azure Web Site 添加ADFS验证支持之一 设置ADFS的信任关系
很多时候企业开发的应用都会通过AD(Active Directory)进行验证用户名密码的,在企业里面统一一个AD来进行账号密码管理也是一个很好的实践.当企业打算将一个应用迁移到Azure的时候,使用 ...