Python抽象类在统一支付接口中的应用详解

一只小鹿
一只小鹿
发布时间:2026-10-16 | 5人浏览过
原创

本文通过京东支付场景,详解Python抽象类(ABCMeta)的应用。文章指出当多种支付方式(支付宝、微信等)方法名不一致时,直接调用会导致混乱。通过定义抽象基类强制子类实现统一的pay()方法,并结合高阶函数调用,实现了支付接口的统一与扩展。文中包含错误写法对比、改进代码及注意事项,帮助开发者理解抽象类在接口规范中的作用。

抽象类的核心作用在于规范子类的方法命名,强制子类必须按照父类定义的要求实现特定的方法,且方法名称需与父类保持一致。

一、问题场景

主要的使用场景如下:

以京东购物为例,用户下单后需要完成支付。京东平台支持多种支付方式,包括支付宝、微信支付、京东白条,以及apppay等。

每种支付方式都需要执行其内部特定的处理流程。

虽然支付的统一入口是京东平台,但点击不同的支付渠道时,后台需要调用不同的处理函数;

这导致统一入口处的调用逻辑变得复杂且难以维护。

class Ali(object):
    def alipay(self):
        pass
class Ten(object):
    def tenpay(self):
        pass
class App(object):
    def apppay(self):
        pass

由于阿里支付、腾讯支付、苹果支付等各自的方法命名各不相同,

二、使用抽象类思想解决

此时,我们可以引入python中的抽象类概念来解决这一问题。

首先需要引入两个必要的模块:

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、如果希望使用抽象类,该类只需继承抽象类即可。

到此这篇关于Python抽象类应用详情的文章就介绍到这了,更多相关Python抽象类内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表