2016-07-02 16 views
8

Próbuję zaakceptować tuple i list jako typy obiektów w metodzie __add__ w Pythonie. Zobacz następujący kod:Implementacja krotek i list w funkcji isinstance w Pythonie 2.7

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, list, tuple)): 
      raise TypeError("Must be of type Point, list, or tuple") 
     x = self.X + other.X 
     y = self.Y + other.Y 
     return Point(x, y) 

p1 = Point(5, 10) 

print p1 + [3.5, 6] 

Błąd pojawia po uruchomieniu go w interpretera Pythona:

AttributeError: 'list' object has no attribute 'X' 

ja po prostu nie mogę zrozumieć, dlaczego nasz to nie działa. To jest praca domowa na kursie uniwersyteckim i mam bardzo małe doświadczenie z Pythonem. Wiem, że funkcja isinstance w Pythonie może przyjmować krotkę obiektów typu, więc nie jestem pewien, który element, który mi brakuje dla obiektów tuple i list, które mają zostać zaakceptowane. Czuję, że to jest coś naprawdę prostego, którego po prostu nie odbieram.

Odpowiedz

3

Jeśli chcesz, aby móc dodać listy lub krotki, zmienić metodę __add__:

def __add__(self, other): 
    if not isinstance(other, (Point, list, tuple)): 
     raise TypeError("Must be of type Point, list, or tuple") 
    if isinstance(other, (list, tuple)): 
     other = Point(other[0], other[1]) 
    x = self.X + other.X 
    y = self.Y + other.Y 
    return Point(x, y) 

W przeciwnym razie trzeba by dodać kolejny obiekt Point , a nie lista. W takim przypadku po prostu dostosuj swoją ostatnią linię:

print p1 + Point(3.5, 6) 
1

Tak prosty jak błąd, który napisałeś: obiekt listy w pythonie (lub prawdopodobnie w dowolnym języku nie ma atrybutów x lub y). musi obsługiwać listy (i krotki również) przypadek osobno