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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:06:05