【问题标题】:Calling a __str__ in python [closed]在 python 中调用 __str__ [关闭]
【发布时间】:2016-01-02 20:42:30
【问题描述】:

我一直在努力完成一项任务。我正在调用位于类 ShapeSet 的子类 Triangle 中的 str 方法(我已经突出显示了相关的代码 n-ps)。当我以这种方式调用它时(直接调用它,打印(三角形),工作得很好),我无法获得正确的字符串输出。

当从类 ShapeSet 调用str 方法时:

<method-wrapper 'str' of list object at 0x011E13C8>

直接调用时:

>>>print(triangle):
Type:Triangle, base:3, height:4

我做错了什么?

class Shape(object):

    def area(self):
        raise AttributeException("Subclasses should override this method.")

class Triangle(Shape):
    def __init__(self, base, height):
        self.base=base
        self.height=height
    def area(self):
        self.area=(self.base*self.height)/2
        return self.area
    def __str__(self):
        return "Type:{}, base:{}, height:{}".format(self.__class__.__name__,                             self.base, self.height)
    def __eq__(self, other):
        return type(other)==Triangle and self.base==other.base and self.height==other.height


class ShapeSet:
    def __init__(self):
         self.shape_dict={}

    def addShape(self, sh): 
        try:
            self.shape_dict[type(sh)].append(sh)
        except KeyError:
            self.shape_dict[type(sh)]=[sh]     

    def __iter__(self):
        return (self)

    def __str__(self):
        for value in self.shape_dict.values():
            return "{}".format(value.__str__)


shape_set=ShapeSet()
triangle=Triangle(3,4)
shape_set.addShape(triangle)
print (triangle)

【问题讨论】:

  • 您能否查看此内容并使用minimal reproducible example 进行更新,更正缩进并明确您获得的输出以及想要的输出。
  • __str__ 是一个函数,而不是字符串本身,你可以调用__str__(),但这是一个神奇的函数,如果你调用str(value) 会调用它,通常你不会直接拨打__str__
  • 这个for循环只会看到一个value,因为你马上return它...for value in self.shape_dict.values():
  • 调用__str__ 通常是使用内置的str 函数完成的,但你真正的问题是没有__repr__ 方法。

标签: python string class


【解决方案1】:

我认为有两个错误:一个是那个值。str是一个函数,所以你想通过添加“()”来调用它。其次,我认为您可能想要打印 ShapeSet 中的所有形状,对吗?在这种情况下,您需要遍历整个列表,而不仅仅是返回您找到的第一个形状。这似乎有效:

def __str__(self):
    s = ''
    for key in self.shape_dict.keys():
        s += '\n'.join([value.__str__() for value in self.shape_dict[key]])
    return s

【讨论】:

  • 感谢阿迪,成功了!
【解决方案2】:

我认为您的主要问题是您在 Triangle 类中定义了 __str__ 而不是 __repr__。当您的 ShapeSet 类尝试输出它时,它正在格式化 listTriangle 实例。 (list 可能只有一个实例,但它仍然是一个列表。)Python 的内置容器使用repr 而不是str 来格式化它们的内容,这样["foo, bar", "baz"] 之类的东西就会很明确。

所以:尝试将__repr__ = __str__ 添加到您的班级,我怀疑事情会更好!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-22
    • 2017-08-06
    • 2018-05-27
    • 2017-07-28
    • 2013-11-25
    • 2023-03-22
    • 2011-03-19
    • 2014-02-17
    相关资源
    最近更新 更多