[英]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.