首页 > 解决方案 > 抽象异常

问题描述

我正在尝试定义一组只能子类化的基本异常,但无法让 python 实际强制执行类的抽象性。

from abc import ABC, abstractmethod

class MyExec(ABC, Exception):
    @abstractmethod
    def func():
        pass

MyExec()

我期待这会引发类似的事情:

TypeError: Can't instantiate abstract class MyExec with abstract methods func

然而实际上它只是工作并且不会出错。

深入挖掘这看起来像是一个方法解析顺序问题。

(Pdb) MyExec.__mro__
(<class '__main__.MyExec'>, <class 'abc.ABC'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>)

看起来abc.ABC是第一个,看起来ABC.__new__是魔法实际上强制抽象的地方。所以我假设在ABC.__new__(实际上是ABCMeta.__new__)和Exception.__new__.

(Pdb) MyExec.__new__ == ABC.__new__
False
(Pdb) MyExec.__new__ == Exception.__new__
True

任何人都知道如何覆盖这个命令或者我在做一些我不应该在这里的事情吗?令人惊讶的是,很少有人对此进行搜索。

编辑:我通过实施此处建议的解决方案解决了这个问题。看起来这是一个核心错误,但他们还没有决定它是文档还是实现错误,并在此期间提供了解决方法。

标签: pythonpython-3.x

解决方案


推荐阅读