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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:20:56