2013-03-01 5 views
13

Ich bin neu in Vektoren und mache Klassen. Ich versuche, meine eigene Vektorklasse zu bauen, aber wenn ich es durch meinen Code übergeben, das ist:Zeile 60, in make_tuple Rücklauftupel (l) TypeError: iter() gab Nicht-Iterator des Typs 'Vector' zurück

Position + = Überschrift * distance_moved

wo Position und Fahrtrichtung beide Vektoren sind. Überschrift ist normalisiert. Mein Ziel ist es, meinen Code bis Position = Ziel zu wiederholen. Was ist falsch an dieser Klasse?

import math

class Vector(object): 
    #defaults are set at 0.0 for x and y 
    def __init__(self, x=0.0, y=0.0): 
     self.x = x 
     self.y = y 

    #allows us to return a string for print 
    def __str__(self): 
     return "(%s, %s)"%(self.x, self.y) 

    # from_points generates a vector between 2 pairs of (x,y) coordinates 
    @classmethod 
    def from_points(cls, P1, P2): 
     return cls(P2[0] - P1[0], P2[1] - P1[1]) 

    #calculate magnitude(distance of the line from points a to points b 
    def get_magnitude(self): 
     return math.sqrt(self.x**2+self.y**2) 

    #normalizes the vector (divides it by a magnitude and finds the direction) 
    def normalize(self): 
     magnitude = self.get_magnitude() 
     self.x/= magnitude 
     self.y/= magnitude 

    #adds two vectors and returns the results(a new line from start of line ab to end of line bc) 
    def __add__(self, rhs): 
     return Vector(self.x +rhs.x, self.y+rhs.y) 

    #subtracts two vectors 
    def __sub__(self, rhs): 
     return Vector(self.x - rhs.x, self.y-rhs.y) 

    #negates or returns a vector back in the opposite direction 
    def __neg__(self): 
     return Vector(-self.x, -self.y) 

    #multiply the vector (scales its size) multiplying by negative reverses the direction 
    def __mul__(self, scalar): 
     return Vector(self.x*scalar, self.y*scalar) 

    #divides the vector (scales its size down) 
    def __div__(self, scalar): 
     return Vector(self.x/scalar, self.y/scalar) 

    #iterator 
    def __iter__(self): 
     return self 

    #next 
    def next(self): 
     self.current += 1 
     return self.current - 1 

    #turns a list into a tuple 
    def make_tuple(l): 
     return tuple(l) 

Antwort

0

Das erste Argument, das in make_tuple übergeben werden wird, ist Ihre Vector Instanz (es ist das gleiche self Argument, das Sie überall setzen).

Sie müssen in passieren, was Sie in ein Tupel machen wollen, was wahrscheinlich ist Ihre x- und y-Koordinaten:

def make_tuple(self): 
    return (self.x, self.y) 
30

Ich denke, man Python 3.x verwenden, weil ich habe einen ähnlichen Fehler bekommen. Ich bin auch neu auf Klasse zu machen, aber es wäre schön, zu teilen, was ich :) gelernt

In 3.x verwendet __next__() statt next() in der Definition von Klassen. Der Fehler ist nicht aufgetreten, nachdem ich es in Ihrem Code umbenannt habe, aber ich habe ein anderes Problem, "'Vector' Objekt hat kein Attribut 'current'" :)

Ich denke, es könnte besser für Sie sein, Iteratoren zu verstehen (und Klasse?) mehr. ein einfachstes Beispiel ist:

class Count: 
    def __init__(self, n): 
     self.max = n 

    def __iter__(self): 
     self.count = 0 
     return self 

    def __next__(self): 
     if self.count == self.max: 
      raise StopIteration 
     self.count += 1 
     return self.count - 1 

if __name__ == '__main__': 
    c = Count(4) 
    for i in c: 
     print(i, end = ',') 

und die Ausgänge sind 0,1,2,3 ,.

Mit einer Vektorklasse möchte ich die Komponenten des Vektors iterieren. Also:

def __iter__(self): 
    self.count = 0 
    self.list = [self.x, self.y, self.z] # for three dimension 
    return self 

def __next__(self): 
    if self.count == len(self.list): 
     raise StopIteration 
    self.count += 1 
    return self.list[self.count - 1] 

und der Iterator gibt die Sequenz x, y, z aus.

Beachten Sie, dass das wichtigste Merkmal von Iteratoren darin besteht, die Sequenz Schritt für Schritt ohne eine ganze Liste zu erstellen. Es ist also keine sehr gute Idee, self.list zu machen, wenn die Sequenz sehr lang sein wird. Weitere Details hier: python tutorial

+0

Danke, das hat es für mich getan. Wenn nun nur die Dokumente nicht so schrecklich veraltet und unvollständig wären, hätten wir das vielleicht alle vermieden. – Basic

Verwandte Themen