Python TreeNode类__str__方法讲解与TypeError报错原因分析
问题1:
__str__方法运行逻辑说明 __str__是Python的内置魔法方法,打印TreeNode实例时会自动调用该方法,返回格式化后的字符串内容,运行逻辑如下:
- 参数
level默认值为0,作用是控制当前节点文本的缩进长度,用来体现树的层级关系 - 首先生成当前节点的文本行:
" " * level + str(self.data) + '\n',即根据当前层级拼接对应数量的缩进,加节点内容再加换行 - 遍历当前节点的所有子节点,对每个子节点执行
child.__str__(level+1),这行代码的作用是递归调用子节点自身的__str__方法,将子节点的层级设置为当前层级+1,这样子节点的缩进会比父节点多一级,再把子节点返回的格式化字符串拼到当前节点的返回结果里 - 最终递归完所有层级的节点后,返回整棵树的格式化字符串,你给出的测试代码执行
print(drinks)的输出结果如下:
Drinks Cold Cola Hot Cappucino
问题2:报错原因说明
报错触发原因
修改addchildren方法为self.children.append(TreeNode.data)后,children列表里存储的不再是TreeNode实例,而是字符串类型的节点值(比如给cold节点加子节点时,存的是字符串'Cola',不是Cola对应的TreeNode对象)。
当执行__str__方法遍历子节点时,拿到的child是字符串类型,此时调用child.__str__(level+1),Python内置字符串的__str__方法不需要传入额外参数,你主动传入了level+1这个参数,就会触发expected 0 arguments, got 1的类型错误。
原写法不会报错的原因
原写法self.children.append(TreeNode)是把TreeNode实例存入children列表,遍历拿到的child都是TreeNode类的实例,你自定义的TreeNode类的__str__方法本身就支持传入level参数,调用时传level+1完全符合方法定义,因此不会报错。
内容的提问来源于stack exchange,提问作者Malay Jeena
相关产品推荐
相关产品推荐

