今天给大家介绍一下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中的抽象类的更多相关文章

  1. 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类

    第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一.    引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...

  2. 在Python中定义和使用抽象类的方法

    https://www.jb51.net/article/87710.htm 像java一样python也可以定义一个抽象类. 在讲抽象类之前,先说下抽象方法的实现. 抽象方法是基类中定义的方法,但却 ...

  3. python中的buildin函数详解(第一篇)

    这会是很长的一个帖子,因为我打算从python最基础的东西开始,尝试去完全的掌握它,buildin中有一些常用的函数比如 abs, open, setattr, getattr, 大家都很了解他们的用 ...

  4. python中的继承原则

     继承是面向对象的重要特征之一,继承是两个类或者多个类之间的父子关系,子进程继承了父进程的所有公有实例变量和方法.继承实现了代码的重用.重用已经存在的数据和行为,减少代码的重新编写,python在类名 ...

  5. Python 中的设计模式详解之:策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中“不见了,或者简化了”. ...

  6. python中的继承和多态

    继承 继承的表现方式: class Animal(): pass class Cat(Animal): #animal是cat的父类,也可以说是基类 pass print(Cat.__bases__) ...

  7. Python中元类

    元类(metaclass) 简单地说,元类就是一个能创建类的类,而类class 是由type创建的,class可以创建对象 type与object的关系详见:python中type和object 1. ...

  8. Python 中的面向对象和异常处理

    在之前我们已经说过了 Python 中内置的主要的几种对象类型,(数,字符串,列表,元组和字典).而面向对象的核心人物还没出场呢 .那么我们常说的对象是什么类型的呢,其实他的类型就是“类”.继承封装和 ...

  9. python 中面向对象编程的几个概念

    Python super() 函数 super() 函数是用于调用父类(超类)的一个方法. super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会 ...

随机推荐

  1. Linux USB 鼠标驱动程序详解(转)

    Linux USB 鼠标驱动程序详解 USB 总线引出两个重要的链表!一个 USB 总线引出两个重要的链表,一个为 USB 设备链表,一个为 USB 驱动链表.设备链表包含各种系统中的 USB 设备以 ...

  2. 对话|人工智能先驱Yoshua Bengio

    ​​ ​ Bengio"> 今年1月份,微软收购深度学习初创公司Maluuba时,Maluuba公司德高望重的顾问.深度学习先驱Yoshua Bengio也接手了微软的人工智能研究顾问 ...

  3. java基础进阶篇(二)_Arraylist ------【java源码栈】

    前言 ArrayList 在开发中用到的频率很高,其中原生态提供的方法有一些很好用的重载版本,其中有的坑该跳得跳啊. 一.ArrayList的6种初始化方法1.构造方法 参数为空2.构造方法 参数为L ...

  4. 7-49 求前n项的阶乘之和 (15 分)

    从键盘输入一个整数n,求前n项的阶乘之和,1+2!+3!+...+n!的和 输入格式: 输入一个大于1的整数.例如:输入20. 输出格式: 输出一个整数.例如:2561327494111820313. ...

  5. RocketMQ - 基础知识

    RocketMQ简介 RocketMQ是阿里开源的消息中间件,它是纯java开发,具有低延迟.高吞吐量.高可用性和适合大规模分布式系统应用的特点.从名字可以看出Rocket火箭,代表RocketMQ主 ...

  6. 从零认识 DOM (一): 对象及继承关系

    先上图为敬! 说明: 图中包括了大部分 DOM 接口及对象, 其中: 青色背景为接口, 蓝色背景为类, 灰色背景表示为 ECMAScript 中的对象 忽略了一部分对象, 包括: HTML/SVG 的 ...

  7. 前端实现html转pdf方法总结

    最近要搞前端html转pdf的功能.折腾了两天,略有所收,踩了一些坑,所以做些记录,为后来的兄弟做些提示,也算是回馈社区.经过一番调(sou)研(suo)发现html导出pdf一般有这几种方式,各有各 ...

  8. IDEA 配置自定义Apache与PHP环境

    1. PHP环境 1.1 插件的安装 1.2 关于php环境的配置 2.关于apache的配置 至此,已经配置成功啦,愉快的学习吧!

  9. springcloud项目实现自定义权限注解进行接口权限验证

    一般在项目开发中会根据登录人员的权限大小对接口也会设置权限,那么对接口权限是怎么实现的呢,大多数都是用自定义权限注解,只需要在接口上加上一个注解就可以实现对接口的权限拦截,是否对该接口有权调用 接下来 ...

  10. 2020ubuntu1804server编译安装redis笔记(三)启动服务和使用redis

    第一篇笔记记录了ubuntu1804server编译安装redis5,接下来要配置redis5了 网址:https://www.cnblogs.com/qumogu/p/12435694.html 第 ...