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:
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?
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.
Tags und Links python