2016-07-02 2 views
8

Ich versuche, tuple und list als Objekttypen in einer __add__-Methode in Python zu akzeptieren. Bitte beachten Sie den folgenden Code ein:Tupel und Listen in der isinstance-Funktion in Python 2.7 implementieren

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] 

Der Fehler, den ich bekommen, wenn es in der Python-Interpreter läuft:

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

ich einfach nicht unser herausfinden kann, warum dies nicht funktioniert. Das sind Hausaufgaben für einen College-Kurs und ich habe sehr wenig Erfahrung mit Python. Ich weiß, dass die isinstance-Funktion in Python ein Tupel von Typobjekten akzeptieren kann, so dass ich nicht sicher bin, welches Element mir für tuple und list Objekte fehlt, die akzeptiert werden. Ich habe das Gefühl, dass das etwas sehr Einfaches ist, das ich einfach nicht wahrnehme.

Antwort

3

Wenn Sie in der Lage sein wollen, Listen oder Tupeln hinzufügen, Ihre __add__ Methode ändern:

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) 

Andernfalls würden Sie einen anderen Point-Objekt hinzufügen müssen , keine Liste. In diesem Fall ändern Sie einfach Ihre letzte Zeile:

print p1 + Point(3.5, 6) 
1

So einfach wie ein Fehler Sie sagt: das Listenobjekt in Python (oder wahrscheinlich in einer beliebigen Sprache hat keine X- oder Y-Attribute). Sie müssen Liste behandeln (und Tupel auch) Fall separat