在python中调用__str__

时间:2016-01-02 20:42:30

标签: python string class

我一直在努力完成任务。我正在调用类ShapeSet中的子类Triangle中的str方法(我已经突出显示了相关的代码片段)。当我以这种方式调用它时,我无法获得正确的字符串输出(直接调用它,print(三角形),工作完全正常)。

从类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)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我认为您的主要问题是您已在__str__课程中定义了__repr__但未Triangle。当您的ShapeSet班级尝试输出时,它会格式化list Trianglelist个实例。 (repr可能只有一个实例,但它仍然是一个列表。)Python的内置容器使用str而不是{{1}格式化其内容所以像["foo, bar", "baz"]这样的东西将是明确的。

所以:尝试在课堂上添加__repr__ = __str__,我怀疑事情会更好!