为什么str不能接第二个参数,而__str__可以?

14 投票
2 回答
7757 浏览
提问于 2025-04-17 01:50

我决定用 str 来打印树的内容,让它看起来像树的结构,使用类似下面的方式:

print tree

这棵树的每个节点都是我自己创建的类的对象,我重载了它们的 __str__ 魔法方法,这样就可以在前面加上 t 个制表符来显示子节点的 str,像这样:

def __str__ (self,t=0) :`
    return t*'\t' + str(self.label) +':' +'\n'+ str(self.l,t+1)+'\n'+str(self.right,t+1)+'\n'

不过,我不能用那个 t 参数直接调用 str,但我可以调用 node.__str__(t=4)。难道 str 只是魔法方法的快捷方式吗?还是说因为解析器在没有检查魔法方法的情况下拒绝了对 str 的额外参数?

附言:我对这个行为很感兴趣。我知道这不是打印树的最好方法,这只是个小技巧;)

2 个回答

3

如果你有一个类 C,里面有一个方法 __str__(self, t=0),那么当你用 str(c) 这个方式来转换对象 c 为字符串时,其实是调用了 C.__str__(c) 这个方法。在这个方法里,参数 t 默认会被设置为零,因为在定义的时候就是这么写的。而 str() 这个函数本身只接受一个参数。

14

想象一下这样一个场景。

def str(obj):
    try:
        return obj.__str__()
    except ...:
        ...

仅仅因为 __str__ 可以接受更多的参数,并不意味着 str 会把这些参数传递过去。

撰写回答