2016-11-10 4 views
0

Ich versuche, ein Programm zu machen Vektoren hinzuzufügen __add __ mit:'int' Objekt hat kein Attribut 'x'

class vects: 
    def __init__(self,x,y): 
     self.x = x 
     self.y = y 

    def __add__(self, vect): 
     total_x = self.x + vect.x 
     total_y = self.y + vect.y 
     return vects(total_x, total_y) 

plusv1 = vects.__add__(2,5) 
plusv2 = vects.__add__(1,7) 
totalplus = plusv1 + plusv2 

Der erzeugte Fehler ist wie folgt:

line 12, in <module> plusv1 = vects.__add__(2,5) 
line 7, in __add__ total_x = self.x + vect.x 
AttributeError: 'int' object has no attribute 'x' 
+1

Die Funktion sollten Sie verwenden wie folgt verwendet werden von dem, was ich von Ihrem Code verstanden habe: 'vects .__ __ (vects (2, 5))' und nicht 'vects .__ __ (2, 5 hinzufügen) 'da die __add__ Definition auf nur 1 Argument wartet, das eine andere Instanz der vects Klasse zu sein scheint – Artemis

Antwort

2

Sie don benutze __add__ nicht so! :-) __add__ wird implizit aufgerufen, wenn + für eine Instanz der Vects Klasse verwendet wird.

Also, was Sie zuerst tun sollten, ist zwei Vektor-Instanzen initialisiert werden:

v1 = Vects(2, 5) 
v2 = Vects(1, 7) 

und sie dann hinzu:

totalplus = v1 + v2 

Wenn Sie ein schönes __str__ fügen Sie eine schöne Darstellung Ihrer neuen bekommen vector:

class Vects: 
    def __init__(self,x,y): 
     self.x = x 
     self.y = y 

    def __add__(self, vect): 
     total_x = self.x + vect.x 
     total_y = self.y + vect.y 
     return Vects(total_x, total_y) 

    def __str__(self): 
     return "Vector({}, {})".format(self.x, self.y) 

Sie können einen Blick auf totalplus bekommen, indem Sie es ausdrucken:

print(totalplus) 
Vector(3, 12) 
+0

Noted thanks für die Hilfe :) – jack

+0

Ich würde jedoch nicht sagen, dass die' __add__' Methode von einer Klasse durch einen direkten Aufruf aufgerufen , wie 'MyClass .__ add __ (object1, object2)', ist absolut nutzlos. Okay, Python ist nicht wirklich für solche Dinge gedacht, aber es könnte in einem sehr komplexen Casting-Fall mit Mehrfachvererbung verwendet werden, wo man die '__add__' Methode einer anderen Klasse aufrufen möchte. Aus irgendeinem Grund. Es kann vorkommen. Schneller als Sie denken. Ich vermute. –

+1

Und natürlich, wenn Sie einen guten Programmierstil haben möchten (siehe [PEP-8] (https://www.python.org/dev/peps/pep-0008/)), sollte die Klasse "Vector" heißen. – Matthias

Verwandte Themen