【问题标题】:How do I get .__repr__() to work correctly?如何让 .__repr__() 正常工作?
【发布时间】:2020-08-27 19:54:08
【问题描述】:

我想在 Python 中使用__repr__,这样我就可以按照我希望的方式看到如下所示的表示。

class Polynomial:
    def __init__(self, *args):
        self.args = args
        def __repr__(self):
            Repr = "Polynomial("
            for i in args:
                if i == 0:
                    Repr = Repr + str(self.args[i])
                else:
                    Repr = Repr + ", "+ str(self.args[i])
            return Repr

所以如果我输入Polynomial(1,2,3),它应该返回'Polynomial(1,2,3)',而不是像<__main__.Polynomial at 0x219eb9f52c8>。但它仍然返回那些没有信息的东西。我哪里做错了?

【问题讨论】:

    标签: python for-loop repr


    【解决方案1】:

    您有多个问题:

    1. 你的缩进不正确,__repr__ 应该是你类的方法。它目前是您的 __init__ 方法的内部方法。
    2. 您正在迭代 args,但您尝试使用 i,就好像它是索引一样(它是实际的 arg)
    3. 您可以使用.join() 轻松地将列表转换为逗号分隔的字符串。

    这是您的方法的工作实现:

    class Polynomial:
        def __init__(self, *args):
            self.args = args
        def __repr__(self):
            Repr = "Polynomial("
            for i in range(len(self.args)):
                if i == 0:
                    Repr = Repr + str(self.args[i])
                else:
                    Repr = Repr + ", "+ str(self.args[i])
            Repr += ")"
            return Repr
    

    这是一种更精简的方法,它使用字符串格式和.join()::

    class Polynomial:
        def __init__(self, *args):
            self.args = args
        def __repr__(self):
            return "Polynomial({})".format(", ".join([str(arg) for arg in self.args]))
    

    【讨论】:

      【解决方案2】:

      这是修复代码中的一些错别字后的解决方案。但我建议您使用 f 字符串和一个衬里表达式来表示字符串。@Selcuk 答案中更好地解释了一个衬里和 f 字符串的使用

      class Polynomial:
          def __init__(self, *args):
              self.args = list(args)
          def __repr__(self):
              Repr = "Polynomial("
              for i,j in enumerate(self.args):
                  if i == 0:
                      Repr = Repr + str(j)
                  else:
                      Repr = Repr + ", "+ str(j)
      
              return Repr + ")"
      

      【讨论】:

      • “你不应该以这种方式处理内置的__repr__:需要引用。
      • @Selcuk 我的坏,从现在开始我会谨慎地说这些话。我现在已经编辑了答案。我认为 f string 是字符串表示的更好的 Pythonic 方式,它应该被视为一种建议。
      • 您应该始终添加散文来解释您的解决方案。请先检查您的事实。
      • @MadPhysicist 现在好了。如果不是,请尽可能编辑答案,因为它会激励我。
      • 你的散文说一个衬里和 f-strings,但你没有在代码中显示它。我觉得你错过了我评论的重点。
      猜你喜欢
      • 2015-05-08
      • 2018-06-11
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多