广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python实现抽象基类的3三种方法
  • 286
分享到

Python实现抽象基类的3三种方法

三种抽象方法 2023-01-31 06:01:12 286人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

python的抽象基类类似于Java、c++等面向对象语言中的接口的概念。抽象基类提供了一种要求子类实现指定协议的方式,如果一个抽象基类要求实现指定的方法,而子类没有实现的话,当试图创建子类或者执行子类代码时会抛出异常。这里简单介绍一下P

python的抽象基类类似于Java、c++面向对象语言中的接口的概念。抽象基类提供了一种要求子类实现指定协议的方式,如果一个抽象基类要求实现指定的方法,而子类没有实现的话,当试图创建子类或者执行子类代码时会抛出异常。这里简单介绍一下Python实现抽象基类的三种方法。


方法一:使用NotImplementedError

见下面的测试代码,只有子类实现了run方法才能运行run。

>>> class Task():
    def __init__(self, x, y):
        self.x = x
        self.y = y

>>> class Task():
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def run(self):
        raise NotImplementedError('Please define "a run method"')

>>> t = Task(1, 2)
>>> t.run()
Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    t.run()
  File "<pyshell#10>", line 6, in run
    raise NotImplementedError('Please define "a run method"')
NotImplementedError: Please define "a run method"
>>>
>>> class SubTask(Task):
    def __init__(self, x, y):
        super().__init__(x, y)

    def run(self):
        print('Task(x=%s, y=%s)' % (self.x, self.y))

>>> st = SubTask(1, 3)
>>> st.run()
Task(x=1, y=3)
>>> 


方法二:使用元类

class TaskMeta(type):
    def __new__(cls, name, bases, attrs):

        new_class = super(TaskMeta, cls).__new__(cls, name, bases, attrs)

        if attrs.pop('abstract', False):
            return new_class

        if not hasattr(new_class, 'run') or not callable(new_class.run):
            raise TypeError('Please define "a run method"')

        return new_class


class Task(metaclass=TaskMeta):
    abstract = True

    def __init__(self, x, y):
        self.x = x
        self.y = y


class SubTask(Task):
    def __init__(self, x, y):
        super().__init__(x, y)

    def run(self):
        print('Task(x=%s, y=%s)' % (self.x, self.y))

测试代码一:

>>> t = Task(1, 3)
>>> t.run()
Traceback (most recent call last):
  File "E:/Code/python3/loggingTest/task.py", line 32, in <module>
    t.run()
AttributeError: 'Task' object has no attribute 'run'
>>> st = SubTask(1, 3)
>>> st.run()
Task(x=1, y=3)


这个示例类似于方法一,但有一些细微的区别。第一个区别就是Task类本身仍然能被实例化,但是不能运行run方法,否则会抛出AttributeError错误。更为重要的区别在于子类。当子类被创建时元类会运行__new__方法,解释器讲不再允许创建没有run方法的子类。

>>> class SubTask(Task):
...    pass
...
Traceback (most recent call last):
  File "E:/Code/python3/loggingTest/task.py", line 31, in <module>
    class SubTask(Task):
  File "E:/Code/python3/loggingTest/task.py", line 10, in __new__
    raise TypeError('Please define "a run method"')
TypeError: Please define "a run method"


方法三:使用@abstractmethod

  abc模块提供了一个使用某个抽象基类声明协议的机制,并且子类一定要提供了一个符合该协议的实现。

import abc


class Task(metaclass = abc.ABCMeta):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    @abc.abstractmethod
    def run(self):
        pass


class SubTask(Task):
    def __init(self, x, y):
        super().__init__(x, y)

    def run(self):
        print('Task(x=%s, y=%s)' % (self.x, self.y))

class OtherSubTask(Task):
    def __init(self, x, y):
        super().__init__(x, y)

和方法一、方法二的示例类似,但略有不同。第一,Task类本身不能被实例化。

>>> t = Task(1, 3)
Traceback (most recent call last):
  File "E:/Code/python3/loggingTest/test.py", line 23, in <module>
    t = Task(1, 3)
TypeError: Can't instantiate abstract class Task with abstract methods run


这与方法一不同,方法一允许基类Task被实例化。

对于不能正确重写run方法的子类,在错误的情况下它与之前的两个方法的差别也是不同的。方法一中,使用NotImplementedError,最终在run方法被调用时引发NotImplementedError错误。在方法二中,使用了自定义的TaskMeta元类, 当这个抽象类被创建时引发TypeError错误。

当没有实现run方法的子类实例化时会报错,给出的错误信息与实例化Task类时给出的一样,逻辑上完全符合预期。

>>> ot = OtherSubTask(1, 3)
Traceback (most recent call last):
  File "E:/Code/python3/loggingTest/test.py", line 27, in <module>
    ot = OtherSubTask(1, 3)
TypeError: Can't instantiate abstract class OtherSubTask with abstract methods run
但是,当你定义了一个重新了run方法的子类时,那么子类就能够被实例化,就能正常工作。

>>> st = SubTask(1, 3)
>>> st.run()
Task(x=1, y=3)



--结束END--

本文标题: Python实现抽象基类的3三种方法

本文链接: https://www.lsjlt.com/news/190414.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python实现抽象基类的3三种方法
    Python的抽象基类类似于Java、C++等面向对象语言中的接口的概念。抽象基类提供了一种要求子类实现指定协议的方式,如果一个抽象基类要求实现指定的方法,而子类没有实现的话,当试图创建子类或者执行子类代码时会抛出异常。这里简单介绍一下P...
    99+
    2023-01-31
    三种 抽象 方法
  • Python抽象基类的定义与使用方法
    目录1、定义抽象基类的子类2、标准库中的抽象基类3、定义抽象基类4、再看白鹅类型前言: 我们写Python基本不需要自己创建抽象基类,而是通过鸭子类型来解决大部分问题。《流畅的Pyt...
    99+
    2022-11-12
  • python 三元条件判断的3种实现方法
    python 三元条件判断的3种实现方法 C语言中有三元条件表达式,如 a>ba:b,Python中没有三目运算符(:),但Python有它自...
    99+
    2023-01-31
    条件 方法 python
  • python抽象类的使用方法
    这篇文章主要介绍了python抽象类的使用方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、问题描述主要使用场景是这样的比如京东上买东西,买完东西后需要支付,京东可以使用...
    99+
    2023-06-08
  • python中的3种定义类方法
    目录1、普通方法2、类方法3、静态方法4、总结python中的3种定义类方法: 普通方法 类方法(@classmethod) 类方法(@classmetho...
    99+
    2022-11-12
  • java中抽象类、抽象方法、接口与实现接口实例详解
    前言对于java中的抽象类,抽象方法,接口,实现接口等具体的概念就不在这里详细的说明了,网上书本都有很多解释,主要是我懒,下面通过一个例子来说明其中的精髓要点,能不能练成绝世武功,踏上封王之路,就看自己的的啦(不要误会,我指的只是我自己啦啦...
    99+
    2023-05-30
    java 抽象类 接口
  • Python实现8种常用抽样方法
    目录概率抽样技术1.随机抽样(Random Sampling)2.分层抽样(Stratified Sampling)3.聚类抽样(Cluster Sampling)4.系统抽样(Systematic Sampling...
    99+
    2022-06-02
    Python 抽样方法
  • Python容器类型转换的3种方法实例
    目录前言一、tuple()二、list()三、set()扩展总结前言 其实容器类型的转换可以说是数据类型的转换,涉及到三个函数,分别是tuple()、list()、set()。为什么...
    99+
    2022-11-10
  • golang实现简单工厂、方法工厂、抽象工厂三种设计模式
    1、简单工厂: 第一步:创建一个文章接口,需要实现阅读和写作的功能。 type Article interface { ReadArticle() string WriteArt...
    99+
    2022-11-13
  • Python随机抽样的三种方法及自定义封装函数实现
    Python随机抽样的三种方法及自定义封装函数实现 在Python中,我们经常需要从一个列表或数据集中随机抽取一些元素,以便进行随机实验、样本测试等操作。本文将介绍Python中常用的三种随机抽样方法...
    99+
    2023-09-06
    python numpy 开发语言
  • Android中传递对象的三种方法的实现
    Android中,Activity和Fragment之间传递对象,可以通过将对象序列化并存入Bundle或者Intent中进行传递,也可以将对象转化为JSON字符串,进行传递。...
    99+
    2022-06-06
    方法 对象 Android
  • 在Python中定义和使用抽象类的方法
    像java一样python也可以定义一个抽象类。 在讲抽象类之前,先说下抽象方法的实现。 抽象方法是基类中定义的方法,但却没有任何实现。在java中,可以把方法申明成一个接口。而在python中实现一个抽象...
    99+
    2022-06-04
    定义 方法 抽象类
  • python中怎么实现抽样分类方法
    这期内容当中小编将会给大家带来有关python中怎么实现抽样分类方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。11.1 算法抽查在实践之前你并不知道哪种算法对你的的数据效果最好。 你需要尝试用不同的算...
    99+
    2023-06-19
  • python实现下载文件的三种方法
    Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块。 当然你也可以利用ftplib从ftp站点下载文件。此外Python还提供了另外一种方法re...
    99+
    2022-06-04
    三种 文件 方法
  • 基于Android中实现定时器的3种解决方法
    在Android开发中,定时器一般有以下3种实现方法:一、采用Handler与线程的sleep(long)方法二、采用Handler的postDelayed(Runnable,...
    99+
    2022-06-06
    方法 定时器 Android
  • Java中多态和抽象类的实现方式
    这篇文章主要讲解了“Java中多态和抽象类的实现方式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中多态和抽象类的实现方式”吧!  多态  1.要实现多态,那么必须存在父子关系(继承...
    99+
    2023-06-02
  • Vue3实现组件级基类的多种方法
    目录使用 mixins、extends使用 hooks (function、class)script setup怎么办Vue3的组件有三种代码组织方式 纯Option API (不含...
    99+
    2023-05-18
    Vue3组件级基类 Vue3组件级
  • 3种Python实现酷炫进度条的实用方法
    目录1、自定义ProgressBar2、tqdm3、Rich前言: 在下载某些文件的时候你一定会不时盯着进度条,在写代码的时候使用进度条可以便捷的观察任务处理情况。 除了使用 pri...
    99+
    2022-11-10
  • python 实现多线程的三种方法总结
    1._thread.start_new_thread(了解) import threading import time import _thread def job(): ...
    99+
    2022-11-12
  • 用python实现零钱找零的三种方法
    1.递归(recursion) def coins_changeREC(coin_values, change): """ 递归实现零钱找零 """ min_count = change ...
    99+
    2023-01-31
    三种 零钱 方法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作