可以在Python中声明抽象异常吗?
我想在Python中声明一个用户定义异常的层次结构。但是,我希望我的顶级用户定义类(可以在Python中声明抽象异常吗?,python,oop,python-2.7,Python,Oop,Python 2.7,我想在Python中声明一个用户定义异常的层次结构。但是,我希望我的顶级用户定义类(TransactionException)是抽象的。也就是说,我打算TransactionException指定需要其子类定义的方法。但是,TransactionException不应被实例化或引发 我有以下代码: from abc import ABCMeta, abstractmethod class TransactionException(Exception): __metaclass__ =
TransactionException
)是抽象的。也就是说,我打算TransactionException
指定需要其子类定义的方法。但是,TransactionException
不应被实例化或引发
我有以下代码:
from abc import ABCMeta, abstractmethod
class TransactionException(Exception):
__metaclass__ = ABCMeta
@abstractmethod
def displayErrorMessage(self):
pass
但是,上面的代码允许我实例化TransactionException
a = TransactionException()
在这种情况下,a
没有意义,应该绘制一个异常。下面的代码删除了TransactionException
是Exception
的子类这一事实
from abc import ABCMeta, abstractmethod
class TransactionException():
__metaclass__ = ABCMeta
@abstractmethod
def displayErrorMessage(self):
pass
这段代码正确地禁止实例化,但现在我不能提出TransactionException
的子类,因为它不再是异常
可以在Python中定义抽象异常吗?如果是,怎么做?若否,原因为何
注意:我使用的是Python2.7,但我很乐意接受Python2.x或Python3.x的答案。Alex Martelli对此主题有一个很好的答案。本质上,它归结为各种基类(对象
,列表
,我想,异常
)的对象初始值设定项(初始化
)在存在抽象方法时的行为
class TransactionException(Exception):
def __init__(self, *args, **kwargs):
raise NotImplementedError('you should not be raising this')
class EverythingLostException(TransactionException):
def __init__(self, msg):
super(TransactionException, self).__init__(msg)
try:
raise EverythingLostException('we are doomed!')
except TransactionException:
print 'check'
try:
raise TransactionException('we are doomed!')
except TransactionException:
print 'oops'
当一个抽象类从对象继承时(这是默认值,如果没有给出其他基类),它的\uuuu init\uuuuu
方法被设置为对象的方法,该方法在检查是否所有抽象方法都已实现时执行繁重的工作
如果抽象类从另一个基类继承,它将获得该类的“\uuuu init\uuu
方法。其他类,如列表
和异常
,似乎不检查抽象方法实现,这就是为什么允许实例化它们
另一个答案提供了建议的解决方法。当然,您还有一个选择,就是简单地接受抽象类将是可实例化的,并尝试阻止它。严格地说,您仍然可以实例化TransactionException
,您只是无法初始化它(exc=TransactionException.\uuuuuuuu新的(TransactionException)
)。但这可能是OP想要的精神。