python 实例化父类对象_在Python中从现有超类实例化子类

博客讨论了在Python中如何优雅地子类化`suds.WebFault`异常,以便在不改变其原有行为的情况下,添加更具体的错误信息。作者尝试使用`__new__`方法将旧异常转换为子类实例,但遇到了问题。建议是复制异常的公共API信息,而不是依赖于非公开数据。博客寻求一种避免修改第三方库代码的方法。
摘要由CSDN通过智能技术生成

所以我正在与第三方库进行交互,这会引发例外情况,但它基本上都会引发相同的异常(特别是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__这个只是一个通行证感觉真的很重要.更不用说一些东西不喜欢自定义的__new__方法(阅读:deepcopy,它不是一个选择,我们使用的测试框架(生菜)使用它,我们已经投入很多).

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

我认为这就是你要求的:

class MoreSpecificError(WebFault):

def __new__(self, old):

old.__class__ = MoreSpecificError

return old

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值