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 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会 ...
随机推荐
- Android apk签名详解——AS签名、获取签名信息、系统签名、命令行签名
Apk签名,每一个Android开发者都不陌生.它就是对我们的apk加了一个校验参数,防止apk被掉包.一开始做Android开发,就接触到了apk签名:后来在微信开放平台.高德地图等平台注册时,需要 ...
- 用RecyclerView做一个小清新的Gallery效果 - Ryan Lee的博客
一.简介 RecyclerView现在已经是越来越强大,且不说已经被大家用到滚瓜烂熟的代替ListView的基础功能,现在RecyclerView还可以取代ViewPager实现Banner效果,当然 ...
- Java程序监控---Metrics
概念 Metrics是一个给JAVA服务的各项指标提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控 目前最为流行的 metrics 库是来自 Coda ...
- C++走向远洋——28(项目三,时间类,2)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:time.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- 新冠疫情下,亚德诺(ADI)全面加速
前言:亚德诺Analog Devices, Inc.(简称ADI),公司总部设在美国马萨诸塞州诺伍德市,设计和制造基地遍布全球.ADI公司被纳入标准普尔500指数(S&P 500 Index) ...
- Asp.net Core MVC(四)
上一篇说的是asp.net mvc核心UseMvc的过程,末尾想捋一下asp.net核心的路由流转过程,现在看来还是要准备下一个代码,熟悉了代码,那么整个流转过程就通了〜 不多说,今儿先看下,Rout ...
- Echarts轻松入门,内附踩坑秘籍
首先介绍一下我们的主角ECharts ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Fir ...
- 从0系统学Android--5.2 发送广播
从0系统学Android--52 发送广播 本系列文章目录:更多精品文章分类 本系列持续更新中.... 初级阶段内容参考<第一行代码> 5.3 发送自定义广播 前面已经学习了如何接受广播了 ...
- c:\Windows\system32\rundll32.exe Windows无法访问指定设备、路径或文件,你可能没有适当的权限访问该项目
非常懂如何修改权限的可以尝试,否则老老实实地重新注册的系统的.dll文件 重新注册方法如下: WIN+R下输入命令: cmd /c for %i in (%windir%\system32\*.dll ...
- layui的form表单的checkbox全选与全不选问题
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <m ...