当我使用ABCMeta和abstractmethod时,我没有看到我的期望.
这在python3中工作正常:
from abc import ABCMeta, abstractmethod
class Super(metaclass=ABCMeta):
@abstractmethod
def method(self):
pass
a = Super()
TypeError: Can't instantiate abstract class Super ...
Run Code Online (Sandbox Code Playgroud)
而在2.6:
class Super():
__metaclass__ = ABCMeta
@abstractmethod
def method(self):
pass
a = Super()
TypeError: Can't instantiate abstract class Super ...
Run Code Online (Sandbox Code Playgroud)
除了ABCMeta之外,如果我从对象派生Super,它们也都可以正常工作(我得到了预期的异常).
如果我从列表中派生超级,他们都"失败"(没有例外).
我想要一个抽象基类作为列表但是抽象,并且在子类中具体.
我做错了,还是我不想在python中使用它?
我想在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的答案.