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()会因为嵌套类作用域问题找不到该类,需要明确引用外层类的嵌套类。
修复方案
- 初始化时传入节点实例:在
StreamChecker.__init__中,将StreamChecker.ReversePrefixTreeNode改为StreamChecker.ReversePrefixTreeNode(),创建实例传给ReversePrefixTree。 - 正确引用嵌套类创建节点:在
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
相关产品推荐
相关产品推荐

