Python Strange Fehler: "TypeError: 'NoneType' Objekt ist nicht aufrufbar"

8

Ich implementiere eine einfache Klasse, um einen 2D Vektor darzustellen. Hier sind die relevanten Bits:

%Vor%

Später habe ich etwas wie:

%Vor%

Ich bekomme TypeError: 'NoneType' object is not callable . Das ist besonders merkwürdig, weil der Fehler nicht auf einer bestimmten Zeile steht, also weiß ich nicht, wo ich hinschauen soll!

Sehr seltsam, also habe ich etwas experimentiert und festgestellt, dass es in der Zeile a+b vorkommt. Außerdem, wenn ich die Klasse nachbearbeite, wie folgt:

%Vor%

Der Fehler verschwindet!

Ich sehe, dass es viele Fragen über einen ähnlichen Fehler gibt - alle scheinen einen Funktionsnamen zu enthalten, der irgendwo durch eine Variable überschrieben wird, aber ich sehe nicht, wo das passiert!

Als weiteren Hinweis, wenn ich den Standard-Rückgabetyp von __getattr__() auf etwas anderes - zum Beispiel str - ändere, verwandelt sich der Fehler in TypeError: 'str' object is not callable

Irgendwelche Ideen, was hier vor sich geht? Gibt es ein Verhalten von __getattr__() , das ich nicht verstehe?

    
Slubb 31.07.2011, 18:34
quelle

1 Antwort

11

Das Problem ist, dass Ihr __getattr__ nichts für andere Attribute als x und y zurückgibt und keinen AttributeError auslöst. Wenn also die __add__ -Methode aufgerufen wird, gibt __getattr__ None und damit Ihren Fehler zurück.

Sie können dies beheben, indem Sie __getattr__ Rückgabewerte für andere Attribute angeben. In der Tat müssen Sie sicherstellen, dass __getattr__ die Methode für alle Attribute, die nicht behandelt werden, aus ihrer Oberklasse aufruft. Aber wirklich __getattr__ ist hier falsch. Es sollte sparsam verwendet werden, und wenn es keine offensichtlichen Lösungen auf höherer Ebene gibt. Zum Beispiel ist __getattr__ für den dynamischen Versand unerlässlich. Aber in Ihrem Fall sind die Werte x und y gut bekannt und gut definiert, bevor der Code ausgeführt wird.

Die richtige Lösung besteht darin, x und y Eigenschaften zu erstellen und __getattr__ überhaupt nicht zu implementieren.

%Vor%     
David Heffernan 31.07.2011, 18:40
quelle

Tags und Links