【问题标题】:Why str can't get a second parameter,when __str__ can?为什么 str 不能得到第二个参数,而 __str__ 可以?
【发布时间】:2011-11-13 06:53:06
【问题描述】:

我决定使用 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 不检查魔术方法?

附:我对这种行为很感兴趣。我知道这不是打印树的最佳方式,它是一种 hack ;)

【问题讨论】:

    标签: python string methods tree operator-overloading


    【解决方案1】:

    如果您有一个带有方法__str__(self, t=0) 的类C,则str(c) 将调用C.__str__(c),它将t 设置为声明的零。 str() 本身只接受一个参数。

    【讨论】:

      【解决方案2】:

      这样想。

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

      仅仅因为__str__ 可以接受更多参数,并不意味着str 被配置为传递这些参数。

      【讨论】:

      • 但如果 str 的行为与您的示例中一样,如果 obj.__str__() 不会导致异常,它将起作用。在我的情况下不会。
      • @Alexander Ivanov:代码中的...省略代码,仅作说明之用。我不打算给出str的完整实现。
      • 我知道,我被别的东西弄糊涂了
      相关资源