python 实例化父类对象_在Python中从现有超类实例化子类
所以我正在與第三方庫進(jìn)行交互,這會引發(fā)例外情況,但它基本上都會引發(fā)相同的異常(特別是suds.WebFault.但是,有可能從異常引發(fā)的數(shù)據(jù)中確定異常的確切類型.我希望將這個(gè)異常抽象為子類化這種類型的異常,即:
from suds import WebFault
class MoreSpecificError(WebFault):
pass
我喜歡子類化,因?yàn)樗粫茐钠谕鸚ebFault的現(xiàn)有實(shí)現(xiàn).我遇到的問題是將WebFault上已有的數(shù)據(jù)傳遞給MoreSpecificError.我想做的是獲取現(xiàn)有的異常對象,然后將其“轉(zhuǎn)換為”子類,不做任何更改或重新運(yùn)行__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
編輯:我現(xiàn)在知道這不起作用,新對象將不是子類的類型
哪個(gè)“有用”,但是需要把__init__這個(gè)只是一個(gè)通行證感覺真的很重要.更不用說一些東西不喜歡自定義的__new__方法(閱讀:deepcopy,它不是一個(gè)選擇,我們使用的測試框架(生菜)使用它,我們已經(jīng)投入很多).
我想知道是否有更好的方法來做到這一點(diǎn)?我知道理想的方法是最初提升子類,但我真的不想開始使用這個(gè)庫的分叉副本.我真的希望Python中有一些魔法,我還不知道.
我認(rèn)為這就是你要求的:
class MoreSpecificError(WebFault):
def __new__(self, old):
old.__class__ = MoreSpecificError
return old
但是,由于here所描述的原因,它存在風(fēng)險(xiǎn).如果您正在做的只是捕獲異常它應(yīng)該可以工作,但不能保證.
我仍然認(rèn)為以正常方式實(shí)際創(chuàng)建一個(gè)新的異常對象會更好.如果您擔(dān)心丟失原始異常中的信息,請查看該異常的文檔,以查看哪些信息記錄為其公共API的一部分,并復(fù)制該信息.依賴于不屬于原始API的異常信息的代碼不是您需要支持新API的代碼.
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的python 实例化父类对象_在Python中从现有超类实例化子类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 更改Ubuntu终端复制和粘贴的快捷键
- 下一篇: u盘锁电脑_程序员用U盘偷公司源码被抓;