[英]instantiate subclass from existing superclass
所以我正在与第三方库进行交互,这会引发例外情况,但它基本上都会引发相同的异常(特别是suds.WebFault
。但是,有可能从异常引发的数据中确定异常的确切类型。我希望将这个异常抽象为子类化这种类型的异常,即:
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
,它不是一个选择,我们使用的测试框架(生菜)使用它,我们已经投入很多)。
我想知道是否有更好的方法来做到这一点? 我知道理想的方法是最初提升子类,但我真的不想开始使用这个库的分叉副本。 我真的希望Python中有一些魔法,我还不知道。
我认为这就是你要求的:
class MoreSpecificError(WebFault):
def __new__(self, old):
old.__class__ = MoreSpecificError
return old
但是,由于此处描述的原因,它存在风险。 如果您所做的只是捕获异常它应该可以工作,但不能保证。
我仍然认为以正常方式实际创建一个新的异常对象会更好。 如果您担心丢失原始异常中的信息,请查看该异常的文档,以查看哪些信息记录为其公共API的一部分,并复制该信息。 依赖于不属于原始API的异常信息的代码不是您需要支持新API的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.