为什么str不能接第二个参数,而__str__可以?
我决定用 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
会把这些参数传递过去。