You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过self.__init__重新初始化Python基类?

问题分析与解决方案

你遇到的核心问题是:Python中实例的方法调用是基于**方法解析顺序(MRO)**的,self.__init__()会优先调用实例所属子类的构造方法,而非父类的。你的x是comDriver的实例,所以在eComm.connect里执行self.__init__()时,实际触发的是comDriver.__init__——这个方法需要传入IP_ADDRESS和PORT参数,不仅会抛出参数缺失的错误,也完全达不到你只想初始化父类属性的目的。

下面给出两种可行的解决办法:

方法1:显式调用父类的__init__方法

直接在需要重新初始化的位置,明确指定调用父类eComm的构造方法,并传入self作为实例参数:

class eComm():
    def __init__(self):
        self.s = "example object"
        self.initialized = True
        self.connected = False
    def connect(self, IP_ADDRESS, PORT):
        if self.initialized:
            print(IP_ADDRESS, PORT)
        else:
            print("REINITIALIZING")
            # 显式调用父类构造方法,绕开子类的__init__
            eComm.__init__(self)
            self.connected = True
        return(True)
class comDriver(eComm):
    def __init__(self, IP_ADDRESS, PORT):
        self.IP = IP_ADDRESS
        self.PORT = PORT
        super().__init__()
    def getTemp(self):
        print("EXAMPLE FUNCTION")
        return(1)

x = comDriver("192", 7)
x.connect("161", 6)
x.initialized = False
x.connect("111", 5)

这种方式直接、直观,能确保只初始化父类中定义的属性,不会触发子类的构造逻辑。

方法2:拆分初始化逻辑到独立方法(更推荐)

更符合Python代码风格的做法是,把父类的初始化逻辑提取到一个单独的方法(比如_reset)中,在__init__里调用它;需要重新初始化时,直接调用这个方法即可,避免直接操作构造方法:

class eComm():
    def __init__(self):
        self._reset()
    def _reset(self):
        # 将原__init__中的初始化逻辑迁移到这里
        self.s = "example object"
        self.initialized = True
        self.connected = False
    def connect(self, IP_ADDRESS, PORT):
        if self.initialized:
            print(IP_ADDRESS, PORT)
        else:
            print("REINITIALIZING")
            self._reset()
            self.connected = True
        return(True)
class comDriver(eComm):
    def __init__(self, IP_ADDRESS, PORT):
        self.IP = IP_ADDRESS
        self.PORT = PORT
        super().__init__()
    def getTemp(self):
        print("EXAMPLE FUNCTION")
        return(1)

x = comDriver("192", 7)
x.connect("161", 6)
x.initialized = False
x.connect("111", 5)

这种方式逻辑更清晰,后续如果子类需要扩展重置逻辑,还可以通过重写_reset方法来实现,扩展性更强。

内容的提问来源于stack exchange,提问作者SubZero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:51:14