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 抽象类的使用详解的详细内容,更多关于python 抽象类的资料请关注我们其它相关文章!

(0)

相关推荐

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

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

  • 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面向对象之接口、抽象类与多态详解

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

  • 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抽象类的新写法

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

  • python 抽象类的使用详解

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

  • MySQL数据库设计之利用Python操作Schema方法详解

    弓在箭要射出之前,低声对箭说道,"你的自由是我的".Schema如箭,弓似Python,选择Python,是Schema最大的自由.而自由应是一个能使自己变得更好的机会. Schema是什么? 不管我们做什么应用,只要和用户输入打交道,就有一个原则--永远不要相信用户的输入数据.意味着我们要对用户输入进行严格的验证,web开发时一般输入数据都以JSON形式发送到后端API,API要对输入数据做验证.一般我都是加很多判断,各种if,导致代码很丑陋,能不能有一种方式比较优雅的验证用户数据呢

  • java 抽象类的实例详解

    java 抽象类的实例详解 前言: 什么是抽象类?这名字听着就挺抽象的,第一次听到这个名字还真有可能被唬住.但是,就像老人家所说的,一切反动派都是纸老虎,一切有着装x名字的概念也是纸老虎.好吧,我们已经从战略上做到了藐视它,现在就要战术上重视它,如同要解决纸老虎,就要一个牙齿一个牙齿地敲,一个爪子一个爪子地拔:解决这种抽象概念也一样,先要把它具体化,细分化,然后一个一个地来. 我一般遇到新的概念都会问三个问题: 1.这个东西有什么用?用来干什么的?它的意义在哪里?(显然,如果是没用的东西,就没必

  • Python之str操作方法(详解)

    1. str.format():使用"{}"占位符格式化字符串(占位符中的索引号形式和键值对形式可以混合使用). >>> string = 'python{}, django{}, tornado{}'.format(2.7, 'web', 'tornado') # 有多少个{}占位符就有多少个值与其对应,按照顺序"填"进字符串中 >>> string 'python2.7, djangoweb, tornadotornado'

  • 基于python时间处理方法(详解)

    在处理数据和进行机器学习的时候,遇到了大量需要处理的时间序列.比如说:数据库读取的str和time的转化,还有time的差值计算.总结一下python的时间处理方面的内容. 一.字符串和时间序列的转化 time.strptime():字符串=>时间序列 time.strftime():时间序列=>字符串 import time start = "2017-01-01" end = "2017-8-12" startTime = time.strptime

  • Python探索之SocketServer详解

    SocketServer,网络通信服务器,是Python标准库中的一个模块,其作用是创建网络服务器.SocketServer模块定义了一些类来处理诸如TCP.UDP.UNIX流和UNIX数据报之上的同步网络请求. SocketServer模块处理网络请求的功能,可以通过两个主要的类来实现:一个是服务器类,一个是请求处理类. 服务器类 处理通信问题,如监听一个套接字并接收连接等: 请求处理类 处理"协议"问题,如解释到来的数据.处理数据并把数据发回给客户端等. 这种实现将服务器的实现过程

  • python学习 流程控制语句详解

    ###################### 分支语句 python3.5 ################ #代码的缩进格式很重要 建议4个空格来控制 #根据逻辑值(True,Flase)判断程序的运行方向 # Ture:表示非空的量(String,tuple元组 .list.set.dictonary),所有非零的数字 # False:0,None .空的量 #逻辑表达式 可以包含 逻辑运算符 and or not if: ##################################

  • Python 调用Java实例详解

    Python 调用Java实例详解 前言: Python 对服务器端编程不如Java 所以这方面可能要调用Java代码 前提: Linux 环境  1 安装 jpype1 安装后测试代码: from jpype import * startJVM(getDefaultJVMPath(), "-ea") java.lang.System.out.println("Hello World") shutdownJVM() 2 调用非jdk的jar包, test.jar 包

  • python 编程之twisted详解及简单实例

    python 编程之twisted详解 前言: 我不擅长写socket代码.一是用c写起来比较麻烦,二是自己平时也没有这方面的需求.等到自己真正想了解的时候,才发现自己在这方面确实有需要改进的地方.最近由于项目的原因需要写一些Python代码,才发现在python下面开发socket是一件多么爽的事情. 对于大多数socket来说,用户其实只要关注三个事件就可以了.这分别是创建.删除.和收发数据.python中的twisted库正好可以帮助我们完成这么一个目标,实用起来也不麻烦.下面的代码来自t

  • Python 文件操作的详解及实例

    Python 文件操作的详解及实例 一.文件操作 1.对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. 起来独自绕阶行. 人悄悄,帘外月胧明. 白首为功名,旧山松竹老,阻归程. 欲将心事付瑶琴. 知音少,弦断有谁听. f = open('小重山') #打开文件 data=f.read()#获取文件内容 f.close() #关闭文件 注意:if in the win,hello文件是utf8保存的,打

随机推荐