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

Python嵌套类定义报错修复求助:LeetCode #1032开发问题

LeetCode #1032嵌套类self参数错误排查与修复

问题重现

我在开发LeetCode #1032题目时遇到嵌套类相关的错误,代码如下:

from collections import deque

class StreamChecker:

    def __init__(self, words):
        self.RPT = StreamChecker.ReversePrefixTree( StreamChecker.ReversePrefixTreeNode )
        
    def query(self, letter):
        ...
    
    class ReversePrefixTreeNode:
        def __init__( self ):
            self.char_dict = {}      # Key is char from word, value is successor node
            self.words = []          # All words that complete at this node
        def successor( self, char ):
            return self.char_dict.get( char, None )
        def getWords( self ):
            return self.words
        def __str__( self ):  return f"[ RPTNode: char_dict = { self.char_dict }, words = { self.words } ]"

    class ReversePrefixTree:
        def __init__( self, root ):
            self.root = root
        def insert( self, word ):
            node = self.root
            for char in reversed( word ):
                if char in node.char_dict:
                    node = node.char_dict[ char ]
                else:
                    next_node = ReversePrefixTreeNode()
                    node.char_dict[ char ] = next_node
                    node = next_node
            node.words.append( word )

def tester():    
    obj = StreamChecker( [ "here", "are", "some", "words" ] )
    print( "obj", obj, "obj.RPT", obj.RPT )
    print( "obj.RPT.root", obj.RPT.root.getWords() )    # 问题行
    
tester()

运行后报错:

obj <__main__.StreamChecker object at 0x00000213C5FB1710> obj.RPT <__main__.StreamChecker.ReversePrefixTree object at 0x00000213C5FB3E50>
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[22], line 41
     38     print( "obj", obj, "obj.RPT", obj.RPT )
     39     print( "obj.RPT.root", obj.RPT.root.getWords() )
---> 41 tester()

Cell In[22], line 39, in tester()
     37 obj = StreamChecker( [ "here", "are", "some", "words" ] )
     38 print( "obj", obj, "obj.RPT", obj.RPT )
---> 39 print( "obj.RPT.root", obj.RPT.root.getWords() )

TypeError: StreamChecker.ReversePrefixTreeNode.getWords() missing 1 required positional argument: 'self'

明明通过对象路径调用方法,却提示缺少self参数,这是为什么?

错误原因

核心问题是你把ReversePrefixTreeNode类本身传给了ReversePrefixTree,而不是创建该类的实例:

  • 在StreamChecker.__init__中,你传入的是StreamChecker.ReversePrefixTreeNode(类对象),而非StreamChecker.ReversePrefixTreeNode()(类的实例)。
  • 因此ReversePrefixTree的self.root存储的是类,不是实例。当你调用obj.RPT.root.getWords()时,本质是调用类的未绑定方法,Python不会自动传入self参数,所以报错。

另外还有一个隐藏问题:在ReversePrefixTree.insert方法中,直接写ReversePrefixTreeNode()会因为嵌套类作用域问题找不到该类,需要明确引用外层类的嵌套类。

修复方案

  1. 初始化时传入节点实例:在StreamChecker.__init__中,将StreamChecker.ReversePrefixTreeNode改为StreamChecker.ReversePrefixTreeNode(),创建实例传给ReversePrefixTree。
  2. 正确引用嵌套类创建节点:在ReversePrefixTree.insert中,将next_node = ReversePrefixTreeNode()改为next_node = StreamChecker.ReversePrefixTreeNode()。

完整修正代码

from collections import deque

class StreamChecker:

    def __init__(self, words):
        # 传入ReversePrefixTreeNode的实例,而不是类本身
        self.RPT = StreamChecker.ReversePrefixTree(StreamChecker.ReversePrefixTreeNode())
        # 插入所有单词到前缀树中
        for word in words:
            self.RPT.insert(word)
        
    def query(self, letter):
        # 补充你的query逻辑
        pass
    
    class ReversePrefixTreeNode:
        def __init__(self):
            self.char_dict = {}      # Key is char from word, value is successor node
            self.words = []          # All words that complete at this node
        def successor(self, char):
            return self.char_dict.get(char, None)
        def getWords(self):
            return self.words
        def __str__(self):  
            return f"[ RPTNode: char_dict = {self.char_dict}, words = {self.words} ]"

    class ReversePrefixTree:
        def __init__(self, root):
            self.root = root
        def insert(self, word):
            node = self.root
            for char in reversed(word):
                if char in node.char_dict:
                    node = node.char_dict[char]
                else:
                    # 明确引用外层类的嵌套类创建实例
                    next_node = StreamChecker.ReversePrefixTreeNode()
                    node.char_dict[char] = next_node
                    node = next_node
            node.words.append(word)

def tester():    
    obj = StreamChecker(["here", "are", "some", "words"])
    print("obj", obj, "obj.RPT", obj.RPT)
    print("obj.RPT.root words:", obj.RPT.root.getWords())
    
tester()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:23:17