簡體   English   中英

從現有超類實例化子類

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM