Python抽象类应用详情

目录
  • 一、问题场景
  • 二、使用抽象类思想解决
    • 1、错误写法
    • 2、改进写法
    • 3、继续优化
  • 三、使用抽象类的注意事项

抽象类作用:抽象类就是控制子类的方法的名称,要求子类必须按照父类的要求的实现指定的方法,且方法名要和父类保持一致

一、问题场景

主要使用场景是这样的

比如京东上买东西,买完东西后需要支付,京东可以使用支付宝进行支付,也可以通过微信支付,也可以通过京东白条支付,也可以通过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、如果想使用抽象类,则该类只需要继承抽象类即可

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

(0)

相关推荐

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

    像java一样python也可以定义一个抽象类. 在讲抽象类之前,先说下抽象方法的实现. 抽象方法是基类中定义的方法,但却没有任何实现.在java中,可以把方法申明成一个接口.而在python中实现一个抽象方法的简单的方法是: class Sheep(object): def get_size(self): raise NotImplementedError 任何从Sheep继承下来的子类必须实现get_size方法.否则就会产生一个错误.但这种实现方法有个缺点.定义的子类只有调用那个方法时才会

  • Python面向对象之接口、抽象类与多态详解

    本文实例讲述了Python面向对象之接口.抽象类与多态.分享给大家供大家参考,具体如下: 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能 接口主要是java等语言中的概念,python中并没有明确的限定 from abc import ABCMeta,abstractmethod class Pay

  • python继承和抽象类的实现方法

    本文实例讲述了python继承和抽象类的实现方法.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: #!/usr/local/bin/python # Fig 9.9: fig09_09.py # Creating a class hierarchy with an abstract base class.   class Employee:    """Abstract base class Employee"""      d

  • Python抽象类的新写法

    记得之前learn python一书里面,因为当时没有官方支持,只能通过hack的方式实现抽象方法,具体如下 最简单的写法 class MyCls(): def foo(self): print('method no implement') 运行的例子 >>> a = MyCls() >>> a.foo() method no implement >>> 这样虽然可以用,但是提示不明显,还是容易误用,当然,还有更好的方法 较为可以接受的写法 class

  • Python如何定义接口和抽象类

    问题 你想定义一个接口或抽象类,并且通过执行类型检查来确保子类实现了某些特定的方法 解决方案 使用 abc 模块可以很轻松的定义抽象基类: from abc import ABCMeta, abstractmethod class IStream(metaclass=ABCMeta): @abstractmethod def read(self, maxbytes=-1): pass @abstractmethod def write(self, data): pass 抽象类的一个特点是它不能

  • python 抽象类的使用详解

    今天给大家介绍一下python中一个强大的功能:抽象类 因为最近发现很多同事不理解抽象类,正好抽空写篇博客,给大家介绍一下抽象类 抽象类的作用就是控制子类的方法的名称,要求子类必须按照父类的要求的实现指定的方法,且方法名要和父类保持一致 一.问题描述 主要使用场景是这样的 比如京东上买东西,买完东西后需要支付,京东可以使用支付宝进行支付,也可以通过微信支付,也可以通过京东白条支付,也可以通过apppay支付, 每种支付需要走内部的流程. 支付的统一入口是京东,但是点击不同的支付,需要走不同的流程

  • Python抽象类应用详情

    目录 一.问题场景 二.使用抽象类思想解决 1.错误写法 2.改进写法 3.继续优化 三.使用抽象类的注意事项 抽象类作用:抽象类就是控制子类的方法的名称,要求子类必须按照父类的要求的实现指定的方法,且方法名要和父类保持一致 一.问题场景 主要使用场景是这样的 比如京东上买东西,买完东西后需要支付,京东可以使用支付宝进行支付,也可以通过微信支付,也可以通过京东白条支付,也可以通过apppay支付, 每种支付需要走内部的流程. 支付的统一入口是京东,但是点击不同的支付,需要走不同的流程,京东这边的

  • Python格式化输出详情

    目录 1.%格式化 1.1简单格式化,不使用可选参数 1.2 复杂格式化,使用可选参数 1.2.1参数 (name),用于选择指定的key 1.2.2参数flags和width,对齐方式和宽度 1.2.3参数.precision 控制小数点后位数 2.format格式化 2.1自定义占位符 2.2自定义关键字 2.3填充与对齐(同时使用) 2.4数字格式化 3.f-String格式化 3.1简单使用 3.2复杂控制 1.%格式化 语法: %[(name)][flags][width].[prec

  • Python 字符串操作详情

    目录 1.字符串的定义 2.转义字符串和原始字符串 4.字符串的运算 4.1 拼接运算符 4.2 成员运算 5.获取字符串长度 6.索引和切片 7.字符串的方法 7.1 转换大小写 7.2 查找操作 7.3性质判断 7.4格式化字符串 8.修剪操作 1.字符串的定义 所谓字符串,就是由0个或者多个字符组成的有限序列. 在Python程序中,如果我们把单个或多个字符用单引号''或者双引号""包裹起来,就可以表示一个字符串,也可以用三个单引号或者双引号进行折行.字符串的字符可以是特殊符号.

  • Python装饰器详情

    目录 1.装饰器 1.1 应用场景 2.万能装饰器 3.多层装饰器 4.带参数的装饰器 1.装饰器 装饰器(Decorator):从字面上理解,就是装饰对象的器件.可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件或者帮助输出. 装饰器的特点是特点是函数是作为其参数出现的,装饰器还拥有闭包的特点. 示例代码如下所示: # 定义一个装饰器 def decorate(func): def wrapper(): func() print("已将学生加入学校学生名单")

  • Python随机数模块详情

    目录 1.生成随机数 1.1 random.random() 方法 1.2 random.randint方法 1.3 random.uniform方法 1.4 random.randrange方法 2.用于序列的函数 2.1 random.choice(seq) 2.2 random.shuffle()方法 2.3 random.sample()方法 前言: 随机数模块实现了各种分布的伪随机数生成器.对于整数,从范围中有统一的选择. 对于序列,存在随机元素的统一选择.用于生成列表的随机排列的函数

  • Python 正则模块详情

    目录 1.正则表达式的装饰符 2.查找单个匹配项 2.2 group 2.3 search 2.4 fullmatch 2.5 匹配对象 3.查找多个匹配项 3.1 compile 3.2 findall 3.3 finditer 4.分割split 4.1 替换 4.1.1 sub 4.1.2 subn 4.2 escape 4.3 purge 在Python中提供了操作正则表达式的模块,即re模块. 1.正则表达式的装饰符 修饰符 描述 完整名称 re.I 使匹配对大小写不敏感 re.IGN

  • Python calendar模块详情

    目录 1. calendar 模块概述 1.1calendar 特点 1.2calendar 类结构 1.3calendar 使用步骤 2. calendar 相关方法 2.2calendar 模块相关方法 2.3calendar 模块属性 2.4calendar 模块提供5个类 2.5calendar.Calendar类实例相关方法 2.6calendar.TextCalendar类实例相关方法 2.7calendar.HTMLCalendar类实例相关方法 2.8calendar.HTMLC

  • python graphviz画图详情

    目录 1.graphviz安装与配置 2.dot和graphviz dot graphviz 前言: 最近要开始做课设来着,题目是哈夫曼编码,我琢磨着有什么办法可以打印出一棵树的结构(其实有一次实验,就要求打印树,那个时候就没能实现),偶然遇到了一篇博客,有提到graphviz这个库,我就扫了一眼,发现居然可以打印各种形状和流程图,直接激动到惊呆. 于是立马pip install graphviz,库很快下载,但就无论如何都画不了图,折腾了将近一个小时,才在大佬的一篇博客里发现,是需要给grap

  • python字符串运算符详情

    知识点:字符串 在编程里,用的最多的就是字符串,字符串同时也是各类数据的中转站 ​字符串运算符:​ 编号 运算符类型 说明 1 + 字符串拼接 2 * 同一字符串多次输出 3 [] 通过下标获取字符串其中一个字符 ​代码如下:​ #!/usr/bin/python3 # -*- coding: utf-8 -*- import random # 字符串连接运算 myStr_a1='51' myStr_a2='cto' myStr=myStr_a1+myStr_a2 print('字符串:'+my

随机推荐