python中的抽象类
今天给大家介绍一下python中一个强大的功能:抽象类
因为最近发现很多同事不理解抽象类,正好抽空写篇博客,给大家介绍一下抽象类
抽象类的作用就是控制子类的方法的名称,要求子类必须按照父类的要求的实现指定的方法,且方法名要和父类保持一致
一、问题描述
主要使用场景是这样的
比如京东上买东西,买完东西后需要支付,京东可以使用支付宝进行支付,也可以通过微信支付,也可以通过京东白条支付,也可以通过apppay支付,
每种支付需要走内部的流程。
支付的统一入口是京东,但是点击不同的支付,需要走不同的流程,京东这边的流程就需要调用不同的函数;
那统一入口这里的调用起来就会比较麻烦
class Ali(object):
def alipay(self):
pass class Ten(object):
def tenpay(self):
pass class App(object):
def apppay(self):
pass
都是一个支付,阿里的支付、腾讯的支付、苹果的支付方法名都不一样
二、解决办法
此时我们就可以引入python中的抽线类
首先需要引入2个模块
from abc import ABCMeta
from abc import abstractmethod
然后实现如下代码
from abc import ABCMeta
from abc import abstractmethod # Payclass就是一个抽象类
class Payclass(metaclass=ABCMeta): @abstractmethod
def pay(self):
pass class Ali(Payclass):
def alipay(self,money):
print("使用阿里支付{money}".format(money = money)) # # 如果想使用抽象类,则只需要继承这个抽象类就可以了
class Ten(Payclass):
def tenpay(self,money):
print("使用微信支付{money}".format(money = money)) class App(Payclass):
def apppay(self,money):
print("使用苹果支付{money}".format(money = money))

比如我们没有按照要求实例化pay这个方法,执行代码会抛错
wec = Ten()

那我们就按照要求修改代码即可,这次实例化就不会抛错
from abc import ABCMeta
from abc import abstractmethod # Payclass就是一个抽象类
class Payclass(metaclass=ABCMeta): @abstractmethod
def pay(self):
pass class Ali(Payclass):
def pay(self,money):
print("使用阿里支付{money}".format(money = money)) # # 如果想使用抽象类,则只需要继承这个抽象类就可以了
class Ten(Payclass):
def pay(self,money):
print("使用微信支付{money}".format(money = money)) class App(Payclass):
def pay(self,money):
print("使用苹果支付{money}".format(money = money)) wec = Ten()
然后我们可以在定义一个函数,搭配抽线类来实现,这个的第一个参数就是每个支付的实例,另外一个参数就是每个支付需要的参数
def pay(obj,*args,**kwargs):
obj.pay(*args,**kwargs)
整体的代码如下,在调整一下参数,整体的代码如下
from abc import ABCMeta
from abc import abstractmethod # Payclass就是一个抽象类
class Payclass(metaclass=ABCMeta): @abstractmethod
def pay(self):
pass class Ali(Payclass):
def pay(self,*args,**kwargs):
print("使用阿里支付{money}".format(money = args[0])) # # 如果想使用抽象类,则只需要继承这个抽象类就可以了
class Ten(Payclass):
def pay(self,*args,**kwargs):
print("使用微信支付{money}".format(money = args[0])) class App(Payclass):
def pay(self,*args,**kwargs):
print("使用苹果支付{money}".format(money = args[0])) wec = Ten() app = App()
def pay(obj,*args,**kwargs):
obj.pay(*args,**kwargs) pay(app,"100")
执行结果如下

三、使用抽象类的注意事项
1、抽象类不能被实例化
2、子类需要严格遵守父类的抽象类的规则,而孙类不需要遵守这个规则
3、如果想使用抽象类,则该类只需要继承抽象类即可
python中的抽象类的更多相关文章
- 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类
第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一. 引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...
- 在Python中定义和使用抽象类的方法
https://www.jb51.net/article/87710.htm 像java一样python也可以定义一个抽象类. 在讲抽象类之前,先说下抽象方法的实现. 抽象方法是基类中定义的方法,但却 ...
- python中的buildin函数详解(第一篇)
这会是很长的一个帖子,因为我打算从python最基础的东西开始,尝试去完全的掌握它,buildin中有一些常用的函数比如 abs, open, setattr, getattr, 大家都很了解他们的用 ...
- python中的继承原则
继承是面向对象的重要特征之一,继承是两个类或者多个类之间的父子关系,子进程继承了父进程的所有公有实例变量和方法.继承实现了代码的重用.重用已经存在的数据和行为,减少代码的重新编写,python在类名 ...
- Python 中的设计模式详解之:策略模式
虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中“不见了,或者简化了”. ...
- python中的继承和多态
继承 继承的表现方式: class Animal(): pass class Cat(Animal): #animal是cat的父类,也可以说是基类 pass print(Cat.__bases__) ...
- Python中元类
元类(metaclass) 简单地说,元类就是一个能创建类的类,而类class 是由type创建的,class可以创建对象 type与object的关系详见:python中type和object 1. ...
- Python 中的面向对象和异常处理
在之前我们已经说过了 Python 中内置的主要的几种对象类型,(数,字符串,列表,元组和字典).而面向对象的核心人物还没出场呢 .那么我们常说的对象是什么类型的呢,其实他的类型就是“类”.继承封装和 ...
- python 中面向对象编程的几个概念
Python super() 函数 super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会 ...
随机推荐
- 内核ioctl函数的cmd宏参数
在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值.cmd除了可区别数字外,还包含有助于处理的几种相应信息. cmd的大小为 32位,共分 4 个 ...
- brup安装证书抓取https
brup安装证书抓取https 0x00下载 下载安装brup 前提是需要java环境 0X01配置brup 配置brup的代理设置 0X02设置浏览器 我使用的是火狐,以下都以火狐为例 0X03证书 ...
- 查看网卡信息 - ethtool
查看网卡是千兆还是万兆网卡,使用ethtool 网络接口名 ethtool eth0
- qt creator源码全方面分析(3-1)
目录 qtcreator.pro 包含qtcreator.pri include(filename) Qt版本判断 message(string) $$运算符 error(string) 包含doc. ...
- metrics模块
class sklearn.metrics 方法 1.分类问题的度量 metrics.accuracy_score metrics.auc metrics.f1_score metrics.preci ...
- nginx设置目录浏览及中文乱码问题解决
在Nginx下默认是不允许列出整个目录的.如需此功能, 先打开nginx.conf文件,在location server 或 http段中加入 autoindex on;另外两个参数最好也加上去: a ...
- SpringBoot图文教程11—从此不写mapper文件「SpringBoot集成MybatisPlus」
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...
- vijos 1449 字符串还原
背景 小K是一位蔚蓝教主的崇拜者(Orz教主er),有一天,他收到了一封匿名信,信告诉了小K由于他表现出色,得到了一次当面Orz教主的机会,但是要当面Orz教主可不那么容易,不是每个人都有资格Orz教 ...
- mongoose .find().limit()返回undefined
当我们使用mongoose的find方法查询数据库的同时,可以使用limit方法来指定返回数据的条数. limit方法基本语法如下所示: >db.COLLECTION_NAME.find().l ...
- 浅析SIEM、态势感知平台、安全运营中心
近年来SIEM.态势感知平台.安全运营中心等概念炒的火热,有的人认为这都是安全管理产品,这些产品就是一回事,有人认为还是有所区分.那么到底什么是SIEM.什么是态势感知平台.什么是安全运营中心,他们之 ...