我正在尝试定义一组只能作为子类的基本异常,但是很难让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解决方案解决了这个问题。看来这是一个核心错误,但他们尚未决定是文档错误还是实施错误,并在此期间提供了解决方法。