如何通过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
相关产品推荐
相关产品推荐

