2016-01-02 7 views
-1

Ive боролся с заданием. Я вызываю метод str, расположенный в подклассе Triangle из класса ShapeSet (я выделил соответствующие коды). Я не могу получить правильный вывод строки, когда я вызываю его таким образом (вызов его напрямую, печать (треугольник), работает отлично).Вызов __str__ в python

При вызове str метода из класса ShapeSet:

<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

Не могли бы вы проанализировать это и обновить с помощью [mcve] исправляющий отступ и дать понять, какой вывод вы * получаете * и какой вывод вы хотите *. – jonrsharpe

+2

'__str__' - это функция, а не сама строка, вы можете называть' __str __() ', но это волшебная функция, и это то, что вызывается, если вы вызываете' str (value) 'вместо этого, как правило, вы не вызываете напрямую '__str__' –

+0

Этот цикл будет рассматривать только одно значение, потому что вы сразу же возвращаете его ...' для значения в self.shape_dict.values ​​(): ' –

ответ

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 
+0

Спасибо Ади, это сработало! – arif

0

Я думаю, что ваш главный вопрос заключается в том, что вы определили __str__, но не __repr__ в вашем Triangle классе. Когда ваш класс ShapeSet пытается его вывести, он форматирует list из Triangle экземпляров. (У list может быть только один экземпляр, но он по-прежнему является списком.) Встроенные контейнеры Python форматируют их содержимое с repr, а не str, так что такие вещи, как ["foo, bar", "baz"], будут недвусмысленными.

Итак: попробуйте добавить __repr__ = __str__ к вашему классу, и я подозреваю, что все будет работать лучше!

Смежные вопросы