从现有超类实例化子类

2024-06-16 14:17:30 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我正在与第三方库交互,它有时会引发异常,但它对所有所有(特别是suds.WebFault)都会引发相同的异常。但是,可以根据引发的异常的数据来确定异常的确切类型。我希望将此异常抽象为子类该类型的异常,即:

from suds import WebFault

class MoreSpecificError(WebFault):
    pass

我喜欢子类化,因为它不会破坏期望WebFault的现有实现。我遇到的问题是将WebFault上的数据传递到MoreSpecificError。我想做的是将现有的异常对象“转换为”子类,不做任何更改或重新运行__init__。到目前为止,我所做的是:

^{pr2}$

编辑:我现在知道这不起作用了,新对象将不是子类的类型

这很有用,但是需要把__init__那只是一个pass对我来说真的很恶心。更不用说有些东西不喜欢定制的__new__方法(读:deepcopy,这不是一个选择,我们使用的测试框架(莴苣)使用它,我们已经投入了相当多的资金)。在

我想知道有没有更好的方法?我知道最理想的方法是在开始时提升子类,但是我真的不想开始使用这个库的分叉副本。我真的希望Python中有一些我还不知道的魔力。在


Tags: 数据对象方法fromimport编辑类型init
1条回答
网友
1楼 · 发布于 2024-06-16 14:17:30

我想这就是你的要求:

class MoreSpecificError(WebFault):
    def __new__(self, old):
        old.__class__ = MoreSpecificError
        return old

然而,由于描述的原因,它是有风险的。如果您所做的只是捕捉异常,那么它可能会起作用,但无法保证。在

我仍然认为以普通的方式实际创建一个新的异常对象会更好。如果您担心丢失来自原始异常的信息,请查看该异常的文档,以查看哪些信息被记录为其公共API的一部分,并复制该信息。依赖于不属于原始API的异常信息的代码不需要用新API来支持。在

相关问题 更多 >