抽象异常

时间:2018-12-07 20:52:45

标签: python python-3.x

我正在尝试定义一组只能作为子类的基本异常,但是很难让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

任何人都知道如何覆盖此顺序,还是我在做我不应该在这里的事情?令人惊讶的是,对此几乎没有进行搜索。

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

0 个答案:

没有答案