如何在Python中重写第三方库父类的__init__方法?
问题:重写第三方库类的__init__方法,改用自定义初始化逻辑
用户提供的简化代码结构如下:
########### 第三方库代码 ############## class LibraryClassA: def __int__(self): # 注:此处为笔误,正确应为__init__ pass class LibraryClassB(LibraryClassA): def __init__(self, cfg): super().__init__() self.cfg = cfg def func(self): print("Do something") ########################################### class UserDefinedClass(LibraryClassB): def new_init(self): print("The new init function") def func(self): print("Do something else") def main(): obj = UserDefinedClass(cfg="CONF") # 注:原代码用class做变量名,属于Python关键字,改为obj避免语法错误
需求:替换第三方库类LibraryClassB原有的__init__初始化逻辑,改用UserDefinedClass中的new_init方法完成初始化。
可行实现方案
方案1:直接重写__init__,完全替换父类逻辑
在自定义类里重写__init__,直接调用自己的new_init,彻底跳过父类LibraryClassB的初始化流程:
class UserDefinedClass(LibraryClassB): def new_init(self): print("The new init function") def func(self): print("Do something else") # 重写初始化方法 def __init__(self): self.new_init()
如果需要兼容原父类__init__的参数传入(但不使用),可以写成:
def __init__(self, *args, **kwargs): self.new_init()
方案2:保留父类必要初始化逻辑
如果祖父类LibraryClassA的初始化逻辑必须保留,但要跳过LibraryClassB的__init__逻辑,可以直接调用祖父类的初始化方法:
class UserDefinedClass(LibraryClassB): def new_init(self): print("The new init function") def func(self): print("Do something else") def __init__(self): # 直接调用LibraryClassA的__init__,跳过LibraryClassB的初始化步骤 super(LibraryClassB, self).__init__() self.new_init()
内容的提问来源于stack exchange,提问作者Gabrysse
相关产品推荐
相关产品推荐

