[ 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 ...
随机推荐
- 深入理解JVM一性能监控工具
一.前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮 ...
- 【基础】一个简单的MVC实例及故障排除
Controller: public ActionResult Index() { string setting = "ApplicationServices"; var conn ...
- Unity3D手游开发日记(1) - 移动平台实时阴影方案
阴影这个东西,说来就话长了,很多年前人们就开始研究出各种阴影技术,但都存在各种瑕疵和问题,直到近几年出现了PSSM,也就是CE3的CSM,阴影技术才算有个比较完美的解决方案.Unity自带的实时阴影, ...
- BZOJ5314 [Jsoi2018]潜入行动 【背包类树形dp】
题目链接 BZOJ5314 题解 设\(f[i][j][0|1][0|1]\)表示\(i\)为根的子树,用了\(j\)个监测器,\(i\)节点是否被控制,\(i\)节点是否放置的方案数 然后转移即可 ...
- linux swap交换分区配置
参考 http://commandos.blog.51cto.com/154976/115288/
- hive1.1.0建立外部表关联HDFS文件
0. 说明 已经安装好Hadoop和hive环境,hive把元数据存储在mysql数据库.这里仅讨论外部表和HDFS的关联,并且删掉外部表之后,对HDFS上的文件没有影响. 1. 在HDFS创建分区, ...
- python学习(九) 网络编程学习--简易网站服务器
python `网络编程`和其他语言都是一样的,服务器这块步骤为:`1. 创建套接字``2. 绑定地址``3. 监听该描述符的所有请求``4. 有新的请求到了调用accept处理请求` Python ...
- TCP与UDP区别详解
TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...
- linux shell学习五
参考:https://www.linuxdaxue.com/ Shell函数 因为函数是脚本类语言,在执行时是逐行执行的,因此,Shell 函数必须先定义后使用. Shell 函数的定义格式如下: [ ...
- bzoj 2844: albus就是要第一个出场 高斯消元
LINK 题意:看题目不如看样例解释.给出有n个数的集合,对这些子集中的数求异或,升序统计所有子集得到的数(重复会被计入),询问一个数x,问这个数出现的第一个位置 思路:在这里要求一个所有可能出现的异 ...