Python抽象类应用详情
作者:勿忘--前行 发布时间:2022-03-24 17:41:13
标签: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
实现代码如下:
1、错误写法
from abc import ABCMeta
from abc import abstractmethod
# Payclass就是一个抽象类
class Pay(metaclass=ABCMeta):
@abstractmethod
def pay(self):
# 定义支付的基础接口
pass
class AliPay(Pay):
def ali_pay(self):
print("这是支付宝支付")
class WetPay(Pay):
def wet_pay(self):
print("这是微信支付")
class HuaweiPay(Pay):
def hua_pay(self):
print("这是华为支付")
比如我们没有按照要求实例化pay这个方法,执行代码会抛错
2、改进写法
那我们就按照要求修改代码即可,这次实例化就不会抛错:
from abc import ABCMeta, abstractmethod
class Pay(metaclass=ABCMeta):
@abstractmethod
def pay(self):
# 定义支付的基础接口
pass
class AliPay(Pay):
def pay(self):
print("这是支付宝支付")
class WetPay(Pay):
def pay(self):
print("这是微信支付")
class HuaweiPay(Pay):
def pay(self):
print("这是华为支付")
AliPay().pay()
执行可成功,结果如下:
3、继续优化
以在定义一个函数,搭配抽线类来实现,这个的第一个参数就是每个支付的实例,另外一个参数就是每个支付需要的参数
def pay(obj,*args,**kwargs):
obj.pay(*args,**kwargs)
详情如下:
from abc import ABCMeta, abstractmethod
class Pay(metaclass=ABCMeta):
@abstractmethod
def pay(self):
# 定义支付的基础接口
pass
class AliPay(Pay):
def pay(self, *args, **kwargs):
print("这是支付宝支付{0}".format(args[0]))
class WetPay(Pay):
def pay(self, *args, **kwargs):
print("这是微信支付{0}".format(args[0]))
class HuaweiPay(Pay):
def pay(self, *args, **kwargs):
print("这是华为支付{0}".format(args[0]))
def pay(obj, *args, **kwargs):
obj.pay(*args, **kwargs)
if __name__ == "__main__":
ali_pay = AliPay()
wet_apy = WetPay()
pay(ali_pay, 100)
pay(wet_apy, 1000)
三、使用抽象类的注意事项
1、抽象类不能被实例化
2、子类需要严格遵守父类的抽象类的规则,而孙类不需要遵守这个规则
3、如果想使用抽象类,则该类只需要继承抽象类即可
来源:https://blog.csdn.net/hey_man2017/article/details/124382769


猜你喜欢
- 大家还记得我们在老版本中,对于线上环境配置中会把所有的 css 多打成一个文件:核心是使用了插件 extract-text-webpack-
- 原文:http://www.htmldog.com/guides/htmlintermediate/badtags/十六 有害的标签 Bad
- 条件判断计算机之所以能做很多自动化的任务,因为它可以自己做条件判断。比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if
- 1、说明GIL规定一个Python解释程序只能同时由一个线程控制。在CPU限制类型和多线程代码中,GIL是一个性能瓶颈。GIL使Python
- 旧版本的代码请见上一篇博文: Python实现带图形界面的炸金花游戏本文尝试在旧版本的基础上,“升级&
- pandas DataFrame数据遍历读取csv内容,格式与数据类型如下data = pd.read_csv('save\LH88
- 目录1、mysqldump执行过程:特点2、导出 CSV 文件(最灵活)执行过程特点3、物理拷贝(最快)过程局限总结1、mysqldump执
- 使用 Response.Redirect "aspxhome.asp" 转向方法的HTTP Status Code 为3
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 11 - Using Fx.Morph, Fx O
- 1.文件的读取和显示方法1: f=open(r'G:\2.txt') print f.read()&nb
- 首先是只有一个change事件changelevel()//选择值若想改变select同时改变row里的值多个事件用;分割开来此时发现cha
- Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–>迭代器定义:对于list、string、tuple
- 上一篇:微软建议的ASP性能优化28条守则(6) 技巧 20:避免在循环语句中使用字符串串联 许多人在循环语句中建立一个字符串,如下所示:
- 因为要写个东西用到,所以百度了一下,居然有朋友乱写,而且比较多,都没有认真测试过,只对字符可以,但是对数字就不可以,而且通用性很差,需要修改
- 一、存储引擎上节我们最后说到,SQL 的执行计划是执行器组件调用存储引擎的接口来完成的。那我们可以理解为:MySQL 这个数据库管理系统是依
- 之所以有这样一篇文章,是因为在前几天的一个晚上,要下班的时候,业务方忽然有一个需求,是需要恢复一个表里面的数据,当时问了下情况
- 本文实例讲述了python使用socket进行简单网络连接的方法。分享给大家供大家参考。具体如下:import socketprint &q
- keras中正则化(regularization)keras内置3种正则化方法keras.regularizers.l1(lambda)ke
- 那么我们现在开始进行安装配置: 1.一般网上
- 本文讲述了Python检测网络延迟的代码。分享给大家供大家参考,具体如下:#!/usr/bin/env python # coding: u