python - 抽象异常
问题描述
我正在尝试定义一组只能子类化的基本异常,但无法让 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
任何人都知道如何覆盖这个命令或者我在做一些我不应该在这里的事情吗?令人惊讶的是,很少有人对此进行搜索。
编辑:我通过实施此处建议的解决方案解决了这个问题。看起来这是一个核心错误,但他们还没有决定它是文档还是实现错误,并在此期间提供了解决方法。
解决方案
推荐阅读
- c# - 将原始字符串解析为对象列表
- mask - GIMP Script-Fu:使用蒙版批量编辑图像
- reactjs - 用于同一项目中的 express 和 react 项目的 Eslint
- c# - 如何将外观相似的 C# 方法归结为通用方法
- node.js - 加载扩展部分 v3_req PEM 时出错
- typeerror - 使用 Python 在 Microsoft AirSim 上进行线程处理会引发类型错误
- python - 可视化来自 Microsoft Azure 读取 API 的 JSON 结果
- hierarchy - 基于孔径 7 层次结构的 H3 地理寻址方案
- haskell - 为什么我在 Haskell 中的 if then else 语句之后会出现解析错误?
- database - 在嵌套数组中查找具有重复元素的 mongo 文档的 ID