从现有超类实例化子类

时间:2014-10-24 19:26:58

标签: python inheritance

所以我与第三方库进行交互,这会引发例外情况,但它基本上为所有(特别是suds.WebFault引发了同样的例外。它是' s但是,可以从引发的异常数据中确定异常的确切类型。我希望将此异常抽象为子类此类型的异常,即:

from suds import WebFault

class MoreSpecificError(WebFault):
    pass

我喜欢子类化,因为它不会破坏期望WebFault的现有实现。我遇到的问题是将WebFault上的数据传递到MoreSpecificError。我想要做的是获取现有的异常对象,然后将其转换为'子类,没有任何更改或重新运行__init__。到目前为止我完成的工作是:

from suds import WebFault

class MoreSpecificError(WebFault):
    # You pass the old WebFault when instantiating this exception.
    # Then it gets poofed into a MoreSpecificError type
    def __new__(cls, internal_fault):
        return internal_fault
    # This is necessary to prevent the parent class' __init__ from being run
    def __init__(self, internal_fault):
        pass

编辑:我现在知道这不起作用,新对象不属于子类'输入

哪个'工作'但是需要将那个__init__仅仅pass感到非常粗暴。更不用说一些东西不喜欢自定义__new__方法(阅读:deepcopy,它不是一个选择,我们使用的测试框架(生菜)使用它,我们&#39 ;已经投入很多了。)

我想知道是否有更好的方法可以做到这一点?我知道理想的方法是最初提升子类,但我真的不想开始使用这个库的分叉副本。我真的希望Python中有一些神奇的东西我还不知道。

1 个答案:

答案 0 :(得分:1)

我认为这就是你要求的:

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

但是,出于here所述的原因,这是有风险的。如果您正在做的只是捕获异常它应该可以工作,但不能保证。

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