今天给大家介绍一下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. Bitstream or PCM?

    背景 提问 讨论精选 一 二 三 四 五 最后 电视上同轴输出的做法. 背景 USB通道下播放声音格式为AAC的视频文件,同轴输出设置为Auto,功放没有声音,设置成PCM,有声音. 提问 Auto/ ...

  2. 阿里大数据竞赛season1 总结

    关于样本测试集和训练集数量上,一般是选择训练集数量不小于测试集,也就是说训练集选取6k可能还不够,大家可以多尝试得到更好的效果: 2. 有人提出归一化方面可能有问题,大家可以查查其他的归一化方法,但是 ...

  3. 手写实现vue的MVVM响应式原理

    文中应用到的数据名词: MVVM   ------------------        视图-----模型----视图模型                三者与 Vue 的对应:view 对应 te ...

  4. USB小白学习之路(3) 通过自定义请求存取外部RAM

    通过自定义请求存取外部RAM 1. 实验简述 此实验是对自定义的供应商特殊命令(vendor specific command bRequest = 0xA3)进行解析,程序中的read me说明如下 ...

  5. Grafana+Prometheus监控mysql性能

    #cmd /usr/local 今天讲一下如何监控服务器中的mysql数据库的性能 一.数据库操作 1.mysql启动 #service mysqld start #启动数据库 #service my ...

  6. python爬虫-scrapy日志

    1.scrapy日志介绍 Scrapy的日志系统是实现了对python内置的日志的封装 scrapy也使用python日志级别分类 logging.CRITICAL logging.ERROE log ...

  7. 使用D3.js构建实时图形

    首先你需要在计算机上安装Node和npm. 数据的可视化表示是传递复杂信息的最有效手段之一,D3.js提供了创建这些数据可视化的强大工具和灵活性. D3.js是一个JavaScript库,用于使用SV ...

  8. 使用GitHub(二):配置并使用Git创建版本库

    使用GitHub(二):配置并使用Git创建版本库 本文简单介绍使用GitHub对代码进行版本控制,包括添加SSHkey.配置Git.使用Git创建版本库并在GitHub上进行管理,主要目的是对学习内 ...

  9. C++冒险攻略(持续更新中。。。)

    C++语言程序设计 我的C++冒险之旅 绪论 计算机系统基本概念 计算机硬件 计算机程序语言 计算机解决问题是程序控制的 程序就是操作步骤 程序要使用语言来表达 机器语言 计算机能识别的是机器语言 机 ...

  10. NetAnalyzer笔记 之 十一 打造自己的协议分析语言(1)初衷与语法构想

    回头看看NetAnalyzer开发系文档上次一篇竟然是2016年,老脸一红.不过这几年墨云成功过的讨到一个温柔贤淑的老婆,有了一个幸福的家庭,去年9月又有了一个大胖儿子,想想也就释然了^_^ 其实这几 ...