2016-07-06 2 views
0
class Point(object): 
    ''' A point on a grid at location x, y ''' 

    def __init__(self, x, y): 
     self.X=x 
     self.Y=y 

    def __str__(self): 
     return "X=" + str(self.X), "Y=" + str(self.Y) 


    def __add__(self, other): 
     if not isinstance(other, Point): 
      raise TypeError("must be of type point") 
     x= self.X+ other.X 
     y= self.Y+ other.Y 
     return Point(x, y) 

p1= Point(5, 8) 
print p1 + [10, 12] 

При попытке добавить список или кортеж в РИТ т.е. печати p1 + [10, 12], я получаюAttributeError: INT объект не имеет атрибута

attributeError: int object has no attribute 

Как эта проблема может быть решена?

+0

Я получаю 'TypeError (" должен быть типа точки ")'. Потому что вы добавляете тип, отличный от точки, к сути. Это именно то, что вы сказали вашему коду, в чем проблема? –

+0

Вы не добавляете баллы. '[10, 12]' явно не равен «Точка (10,12)». Вы добавляете a) список в точку, b) указываете на список. В настоящее время обе операции не поддерживаются вашим кодом. первый может потенциально быть реализован (но на самом деле не должен), во-вторых, нет. –

ответ

3

Прежде всего, я не могу воспроизвести точную ошибку, которую вы показываете, но я считаю, что это своего рода «опечатка». Вы пытаетесь добавить экземпляр list к экземпляру Point, в то время как метод __add__ более поздней версии выдает ошибку всякий раз, когда вы пытаетесь добавить что-либо, что не является экземпляром Point.

def __add__(self, other): 
    if not isinstance(other, Point): 
     raise TypeError("must be of type point") 

Вы можете преодолеть это, добавив справедливую битполиморфизм.

from collections import Sequence 


class Point(object): 
    ... 

    def _add(self, other): 
     x = self.X + other.X 
     y = self.Y + other.Y 
     return Point(x, y) 

    def __add__(self, other): 
     if isinstance(other, type(self)): 
      return self._add(other) 
     elif isinstance(other, Sequence) and len(other) == 2: 
      return self._add(type(self)(*other)) 
     raise TypeError("must be of type point or a Sequence of length 2") 
0

У вас может быть запятая вместо плюса. Посмотрите на

def __str__(self): 
    return "X=" + str(self.X), "Y=" + str(self.Y) 

Какой должна быть

def __str__(self): 
    return "X=" + str(self.X) + ", Y=" + str(self.Y) 

По крайней мере, на Python3, когда я это исправить ваш код работает хорошо. Очевидно, используя print(p1 + Point(10,12)).

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