我一直在努力完成任务。我正在调用类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)
答案 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
Triangle
个list
个实例。 (repr
可能只有一个实例,但它仍然是一个列表。)Python的内置容器使用str
而不是{{1}格式化其内容所以像["foo, bar", "baz"]
这样的东西将是明确的。
所以:尝试在课堂上添加__repr__ = __str__
,我怀疑事情会更好!