可以在Python中声明一个抽象异常吗?

Mat*_*oss 6 python oop python-2.7

我想在Python中声明用户定义的异常的层次结构.但是,我希望我的顶级用户定义的class(TransactionException)是抽象的.也就是说,我打算TransactionException指定其子类需要定义的方法.但是,TransactionException永远不应该实例化或提出.

我有以下代码:

from abc import ABCMeta, abstractmethod

class TransactionException(Exception):
    __metaclass__ = ABCMeta

    @abstractmethod
    def displayErrorMessage(self):
        pass
Run Code Online (Sandbox Code Playgroud)

但是,上面的代码允许我实例化TransactionException...

a = TransactionException()
Run Code Online (Sandbox Code Playgroud)

在这种情况下a是没有意义的,而应该绘制一个例外.以下代码删除了TransactionException作为Exception... 的子类的事实

from abc import ABCMeta, abstractmethod

class TransactionException():
    __metaclass__ = ABCMeta

    @abstractmethod
    def displayErrorMessage(self):
        pass
Run Code Online (Sandbox Code Playgroud)

这段代码正确地禁止实例化,但现在我不能提出一个子类,TransactionException因为它Exception不再是一个子类.

可以在Python中定义一个抽象异常吗?如果是这样,怎么样?如果没有,为什么不呢?

注意:我使用的是Python 2.7,但很乐意接受Python 2.x或Python 3.x的答案.

voi*_*hos 4

Alex Martelli对此主题有一个很好的回答。本质上,它归结为当存在抽象方法时,__init__各种基类(object、、list和,我认为, )的对象初始值设定项()的行为方式。Exception

当一个抽象类继承自object(这是默认的,如果没有给出其他基类)时,它的__init__方法被设置为 的方法object,这会执行繁重的工作来检查是否所有抽象方法都已实现。

如果抽象类继承自不同的基类,它将获得该类的__init__方法。其他类,例如listException,似乎不检查抽象方法实现,这就是允许实例化它们的原因。

另一个答案为此提供了建议的解决方法。当然,您的另一个选择是简单地接受抽象类将是可实例化的,并尝试阻止它。