gpt4 book ai didi

python - 制作一个继承自 Exception 的抽象基类

转载 作者:太空宇宙 更新时间:2023-11-03 20:28:33 26 4
gpt4 key购买 nike

我正在尝试为应用程序中引发的异常创建自定义基类。我想让它成为一个不能直接实例化的抽象类(使用 abc 模块),以迫使自己为不同类型的错误情况定义更具体的具体子类。

我可以定义一个继承自自定义具体类的抽象类。然而,令我惊讶的是,如果我让抽象类(直接或间接)继承自 Exception,它又可以直接实例化,这就违背了使其抽象的初衷。

我想了解这里发生了什么,以便我可以使我的自定义异常类真正抽象,而不是直接实例化。

我尝试了将自定义异常类声明为抽象的不同变体,包括使用 metaclass=abc.ABCMeta 语法以及从 abc.ABC 继承。无论它以何种方式声明为抽象,一旦我让它继承Exception,它的行为就不再像抽象类。

对我来说相关的Python版本是3.5、3.6和3.7。我在 Python 3.5.2 (Ubuntu 16.04) 和 3.6.8 (Ubuntu 18.04) 上测试了以下代码。

以下内容似乎按预期工作:由于抽象方法,实例化 AppException 失败(TypeError: Can't instantiate Abstract class AppException with AbstractMethods Abs_method)。

请注意,虽然这些类称为 *Exception,但它们(还)不是从真正的内置 Exception 类继承的。

import abc

class BaseException():
pass

class AppException(BaseException, abc.ABC):

@abc.abstractmethod
def abs_method(self):
pass

class ConcreteException(AppException):

def abs_method(self):
return "concrete method"

# BaseException can be instantiated just fine
a = BaseException()

# ConcreteException can be instantiated just fine
c = ConcreteException()

# It shouldn't be possible to instantiate AppException directly,
# so this line should raise a TypeError
b = AppException()

当我更改 BaseException 的定义以从实际的 Exception 类继承时:

class BaseException(Exception):
pass

然后TypeError消失了,所以这次AppException的实例化确实起作用了。 AppException 不再表现为抽象类,尽管根据我的理解,它应该如此。

这是actual code ,目前一直处于草稿 PR 状态,直到我弄清楚发生了什么。

最佳答案

这已在本 SO discussion 前面介绍过。 .

没有明显的解决方案,但一种可能的解决方法(来自上面的 SO 讨论)是在“抽象”扩展类中添加一个 __init__ 方法,以防止它被直接实例化。

关于python - 制作一个继承自 Exception 的抽象基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57658862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com