Python多重继承问题:调用super()触发最大递归深度超出错误
解决Python多重继承中super()导致的递归深度超限错误
我一眼就瞅出问题所在了——你的代码陷入了循环初始化的无限递归,这才触发了maximum recursion depth reached错误。咱们来拆解下原因:
- 当你实例化
program类时,它的__init__方法会创建welcomewin的实例:self.welcomeWindow = welcomewin() - 而
welcomewin继承自program,它的__init__又通过super().__init__()调用了父类program的构造函数 - 这就形成了死循环:
program.__init__→ 创建welcomewin→welcomewin.__init__→ 调用program.__init__→ ... 直到Python的递归深度上限被触发
修复方案一:用组合代替继承(推荐)
从代码逻辑来看,welcomewin更像是program的一个窗口组件,而非它的子类,继承在这里完全没必要。咱们改用组合的方式,让welcomewin持有program的实例来共享功能:
class Program(object): # 遵循PEP8规范,类名用大驼峰 def back(self): if self.currentWin == "welcome": self.welcomeWindow.root.destroy() exit(0) def login(self): print("login") def register(self): print("register") def __init__(self): super().__init__() self.currentWin = "welcome" # 将当前Program实例传递给WelcomeWin self.welcomeWindow = WelcomeWin(self) class WelcomeWin(object): # 不再继承Program def __init__(self, program_instance): self.program = program_instance # 保存Program实例,方便调用其方法 # 这里写你的窗口初始化代码,比如: # self.root = tk.Tk() # 假设你用Tkinter # 测试代码 if __name__ == "__main__": app = Program()
这样既可以在WelcomeWin里通过self.program调用Program的back()、login()等方法,又彻底打破了递归循环。
修复方案二:延迟窗口初始化(若必须保留继承)
如果你确实需要让welcomewin继承program,那得把窗口实例的创建从父类构造函数中分离出来,避免循环触发:
class Program(object): def back(self): if self.currentWin == "welcome": self.welcomeWindow.root.destroy() exit(0) def login(self): print("login") def register(self): print("register") def __init__(self): super().__init__() self.currentWin = "welcome" self.welcomeWindow = None # 先初始化为None,延迟创建 def create_welcome_window(self): # 在需要的时候再创建WelcomeWin实例 self.welcomeWindow = WelcomeWin() class WelcomeWin(Program): def __init__(self): super().__init__() # 你的窗口初始化代码 # 测试代码 if __name__ == "__main__": app = Program() app.create_welcome_window() # 手动调用创建窗口,避免递归
额外小建议
遵循Python的PEP8编码规范,类名使用大驼峰命名法(比如Program、WelcomeWin),这样代码可读性会更高哦~
内容的提问来源于stack exchange,提问作者zombmage
相关产品推荐
相关产品推荐

