我想在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的答案.
我花了很多时间研究这个,但没有一个答案看起来像我想要的那样.
我有一个带有类属性的抽象类,我希望每个子类都被强制实现
class AbstractFoo():
forceThis = 0
Run Code Online (Sandbox Code Playgroud)
所以,当我这样做
class RealFoo(AbstractFoo):
pass
Run Code Online (Sandbox Code Playgroud)
它会抛出一个错误,告诉我在实现之前它无法创建类forceThis.
我怎样才能做到这一点?
(我不希望该属性是只读的,但如果这是唯一的解决方案,我会接受它.)
对于一个类方法,我发现我可以做到
from abc import ABCMeta, abstractmethod
class AbstractFoo(metaclass=ABCMeta):
@classmethod
@abstractmethod
def forceThis():
"""This must be implemented"""
Run Code Online (Sandbox Code Playgroud)
以便
class RealFoo(AbstractFoo):
pass
Run Code Online (Sandbox Code Playgroud)
至少抛出错误 TypeError: Can't instantiate abstract class EZ with abstract methods forceThis
(虽然它不强制forceThis成为一种类方法.)
如何为类属性弹出类似的错误?